@archont561/qgis-sdk 0.0.0 → 0.3.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.
@@ -0,0 +1,323 @@
1
+ import {
2
+ QgisSdkError2
3
+ } from "./shared/chunk-0fknax6w.js";
4
+
5
+ // src/testing.ts
6
+ var PROTOCOL = 1;
7
+ var SUBSCRIPTION_CAPACITY = 64;
8
+ function fault(code, message) {
9
+ return Object.freeze({ fault: Object.freeze({ code, message }) });
10
+ }
11
+ function isFault(value) {
12
+ return typeof value === "object" && value !== null && "fault" in value && typeof value.fault === "object";
13
+ }
14
+ var SILENCE = Symbol("qgis-sdk-harness-silence");
15
+
16
+ class QgisSdkBridgeHarnessError extends QgisSdkError2 {
17
+ constructor(message) {
18
+ super(message, "harness_error");
19
+ }
20
+ }
21
+
22
+ class Harness {
23
+ listenerSet = new Set;
24
+ expectations = [];
25
+ recorded = [];
26
+ unexpectedCalls = [];
27
+ streams = new Map;
28
+ problems = [];
29
+ outbox = [];
30
+ draining = null;
31
+ streamCounter = 0;
32
+ get calls() {
33
+ return [...this.recorded];
34
+ }
35
+ get unexpected() {
36
+ return [...this.unexpectedCalls];
37
+ }
38
+ get openSubscriptions() {
39
+ return [...this.streams.values()].filter((stream) => stream.open).map((stream) => stream.id);
40
+ }
41
+ get listeners() {
42
+ return this.listenerSet.size;
43
+ }
44
+ subscribe(listener) {
45
+ this.listenerSet.add(listener);
46
+ return () => {
47
+ this.listenerSet.delete(listener);
48
+ if (this.listenerSet.size === 0) {
49
+ for (const stream of this.streams.values()) {
50
+ stream.open = false;
51
+ }
52
+ }
53
+ };
54
+ }
55
+ send(message) {
56
+ const envelope = this.parseEnvelope(message);
57
+ if (envelope.kind === "unsubscribe") {
58
+ this.closeFromPage(envelope);
59
+ return;
60
+ }
61
+ const expectation = this.take(envelope.kind, envelope.operation);
62
+ if (expectation === undefined) {
63
+ this.unexpectedCalls.push(envelope);
64
+ this.deliverFailure(envelope.callId, "unexpected_call", `no expectation covers ${envelope.kind} ${JSON.stringify(envelope.operation)}`);
65
+ return;
66
+ }
67
+ if (expectation.kind === "invoke") {
68
+ this.answerInvoke(envelope, expectation);
69
+ return;
70
+ }
71
+ this.answerSubscribe(envelope, expectation);
72
+ }
73
+ expectInvoke(operation, handler) {
74
+ this.expectations.push({
75
+ kind: "invoke",
76
+ operation,
77
+ handler
78
+ });
79
+ }
80
+ expectSubscribe(operation, script, options = {}) {
81
+ this.expectations.push({
82
+ kind: "subscribe",
83
+ operation,
84
+ script,
85
+ options
86
+ });
87
+ }
88
+ deliver(raw) {
89
+ this.outbox.push(raw);
90
+ this.drain();
91
+ }
92
+ settled() {
93
+ return this.draining ?? Promise.resolve();
94
+ }
95
+ assertSatisfied() {
96
+ const problems = [...this.problems];
97
+ if (this.expectations.length > 0) {
98
+ const unmet = this.expectations.map((expectation) => `${expectation.kind} ${expectation.operation}`);
99
+ problems.push(`unmet expectations: ${unmet.join(", ")}`);
100
+ }
101
+ if (this.unexpectedCalls.length > 0) {
102
+ const unexpected = this.unexpectedCalls.map((call) => `${call.kind} ${call.operation}`);
103
+ problems.push(`unexpected calls: ${unexpected.join(", ")}`);
104
+ }
105
+ const open = this.openSubscriptions;
106
+ if (open.length > 0) {
107
+ problems.push(`open subscriptions: ${open.join(", ")}`);
108
+ }
109
+ if (problems.length > 0) {
110
+ throw new QgisSdkBridgeHarnessError(problems.join("; "));
111
+ }
112
+ }
113
+ answerInvoke(call, expectation) {
114
+ this.resolveHandler(call, () => expectation.handler(call.payload ?? {})).then((reply) => {
115
+ if (reply === SILENCE) {
116
+ return;
117
+ }
118
+ if (isFault(reply)) {
119
+ this.deliverFailure(call.callId, reply.fault.code, reply.fault.message);
120
+ return;
121
+ }
122
+ this.deliver({
123
+ protocol: PROTOCOL,
124
+ call_id: call.callId,
125
+ ok: true,
126
+ value: reply
127
+ });
128
+ });
129
+ }
130
+ answerSubscribe(call, expectation) {
131
+ this.streamCounter += 1;
132
+ const open = {
133
+ id: `s${this.streamCounter}`,
134
+ operation: call.operation,
135
+ seq: 0,
136
+ open: false
137
+ };
138
+ const held = [];
139
+ let sink = (frame) => {
140
+ held.push(frame);
141
+ };
142
+ const stream = this.scripted(open, (frame) => sink(frame));
143
+ const ack = expectation.options.ack ?? (() => Promise.resolve());
144
+ ack().then(() => this.resolveHandler(call, () => {
145
+ open.open = true;
146
+ return expectation.script(call.payload ?? {}, stream);
147
+ })).then((outcome) => {
148
+ if (outcome === SILENCE || isFault(outcome)) {
149
+ open.open = false;
150
+ held.length = 0;
151
+ if (isFault(outcome)) {
152
+ this.deliverFailure(call.callId, outcome.fault.code, outcome.fault.message);
153
+ }
154
+ return;
155
+ }
156
+ if (this.listenerSet.size === 0) {
157
+ open.open = false;
158
+ held.length = 0;
159
+ return;
160
+ }
161
+ this.streams.set(open.id, open);
162
+ this.deliver({
163
+ protocol: PROTOCOL,
164
+ call_id: call.callId,
165
+ ok: true,
166
+ value: {
167
+ subscription_id: open.id,
168
+ capacity: SUBSCRIPTION_CAPACITY
169
+ }
170
+ });
171
+ sink = (frame) => this.deliver(frame);
172
+ for (const frame of held) {
173
+ sink(frame);
174
+ }
175
+ held.length = 0;
176
+ });
177
+ }
178
+ resolveHandler(call, run) {
179
+ return new Promise((resolve) => {
180
+ resolve(run());
181
+ }).catch((error) => {
182
+ const message = error instanceof Error ? error.message : String(error);
183
+ this.problems.push(`handler for ${call.kind} ${call.operation} threw: ${message}`);
184
+ return fault("harness_error", message);
185
+ });
186
+ }
187
+ scripted(open, sink) {
188
+ const requireOpen = (verb) => {
189
+ if (!open.open) {
190
+ throw new QgisSdkBridgeHarnessError(`cannot ${verb} on subscription ${open.id}: it is not open`);
191
+ }
192
+ };
193
+ return {
194
+ id: open.id,
195
+ operation: open.operation,
196
+ get open() {
197
+ return open.open;
198
+ },
199
+ emit: (kind, payload) => {
200
+ requireOpen("emit");
201
+ sink({
202
+ protocol: PROTOCOL,
203
+ subscription_id: open.id,
204
+ seq: open.seq,
205
+ event: { kind, payload }
206
+ });
207
+ open.seq += 1;
208
+ },
209
+ end: (terminal) => {
210
+ requireOpen("end");
211
+ open.open = false;
212
+ sink({
213
+ protocol: PROTOCOL,
214
+ subscription_id: open.id,
215
+ seq: open.seq,
216
+ terminal
217
+ });
218
+ open.seq += 1;
219
+ },
220
+ skip: (frames) => {
221
+ requireOpen("skip");
222
+ open.seq += frames;
223
+ }
224
+ };
225
+ }
226
+ closeFromPage(call) {
227
+ const open = call.subscriptionId === undefined ? undefined : this.streams.get(call.subscriptionId);
228
+ const disposed = open?.open === true;
229
+ if (open !== undefined) {
230
+ open.open = false;
231
+ }
232
+ this.deliver({
233
+ protocol: PROTOCOL,
234
+ call_id: call.callId,
235
+ ok: true,
236
+ value: { disposed }
237
+ });
238
+ }
239
+ deliverFailure(callId, code, message) {
240
+ this.deliver({
241
+ protocol: PROTOCOL,
242
+ call_id: callId,
243
+ ok: false,
244
+ error: { code, message }
245
+ });
246
+ }
247
+ drain() {
248
+ if (this.draining !== null) {
249
+ return;
250
+ }
251
+ this.draining = (async () => {
252
+ while (this.outbox.length > 0) {
253
+ await Promise.resolve();
254
+ const message = this.outbox.shift();
255
+ for (const listener of [...this.listenerSet]) {
256
+ listener(message);
257
+ }
258
+ }
259
+ this.draining = null;
260
+ })();
261
+ }
262
+ take(kind, operation) {
263
+ const index = this.expectations.findIndex((expectation) => expectation.kind === kind && expectation.operation === operation);
264
+ if (index === -1) {
265
+ return;
266
+ }
267
+ return this.expectations.splice(index, 1)[0];
268
+ }
269
+ parseEnvelope(message) {
270
+ if (typeof message !== "object" || message === null) {
271
+ throw new QgisSdkBridgeHarnessError("the client sent a non-object");
272
+ }
273
+ const raw = message;
274
+ if (raw.protocol !== PROTOCOL) {
275
+ throw new QgisSdkBridgeHarnessError(`the client speaks protocol ${String(raw.protocol)}; the harness fakes ${PROTOCOL}`);
276
+ }
277
+ if (typeof raw.call_id !== "string" || raw.call_id.length === 0) {
278
+ throw new QgisSdkBridgeHarnessError("the client sent no call_id");
279
+ }
280
+ const callId = raw.call_id;
281
+ if (raw.kind === "unsubscribe") {
282
+ const subscriptionId = raw.subscription_id;
283
+ if (typeof subscriptionId !== "string") {
284
+ throw new QgisSdkBridgeHarnessError(`${callId}: unsubscribe names no subscription_id`);
285
+ }
286
+ const call = {
287
+ callId,
288
+ kind: "unsubscribe",
289
+ operation: this.streams.get(subscriptionId)?.operation ?? "",
290
+ subscriptionId
291
+ };
292
+ this.recorded.push(call);
293
+ return call;
294
+ }
295
+ if (raw.kind !== "invoke" && raw.kind !== "subscribe") {
296
+ throw new QgisSdkBridgeHarnessError(`${callId}: ${String(raw.kind)} is not a bridge envelope kind`);
297
+ }
298
+ if (typeof raw.operation !== "string") {
299
+ throw new QgisSdkBridgeHarnessError(`${callId}: operation must be a string`);
300
+ }
301
+ const payload = typeof raw.payload === "object" && raw.payload !== null ? raw.payload : {};
302
+ const call = {
303
+ callId,
304
+ kind: raw.kind,
305
+ operation: raw.operation,
306
+ payload
307
+ };
308
+ this.recorded.push(call);
309
+ return call;
310
+ }
311
+ }
312
+ function createBridgeHarness() {
313
+ return new Harness;
314
+ }
315
+ export {
316
+ QgisSdkBridgeHarnessError,
317
+ SILENCE,
318
+ createBridgeHarness,
319
+ fault
320
+ };
321
+
322
+ //# debugId=8E66F11E152CD67C64756E2164756E21
323
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKFRBU0stMTgsIGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIGRvYy0xNC4gS2VlcCB0aGUgdHdvIGFwYXJ0IGluIHJlcG9ydHMuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgaGFybmVzcyBzZW5kcyBpcyBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHksIG9uZSBtZXNzYWdlIHBlclxuICogbWljcm90YXNrLCBzbyBhIHJlcGx5IG5ldmVyIHJlLWVudGVycyB0aGUgY2xpZW50IGluc2lkZSBpdHMgb3duIGBzZW5kYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRTdHJlYW1FdmVudEtpbmQsXG5cdFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgUFJPVE9DT0wgPSAxO1xuY29uc3QgU1VCU0NSSVBUSU9OX0NBUEFDSVRZID0gNjQ7XG5cbi8qKiBBIHNjcmlwdGVkIGhvc3QgZmFpbHVyZSwgcmV0dXJuZWQgZnJvbSBhbiBleHBlY3RhdGlvbidzIGhhbmRsZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkRmF1bHQge1xuXHRyZWFkb25seSBmYXVsdDogeyByZWFkb25seSBjb2RlOiBzdHJpbmc7IHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB9O1xufVxuXG4vKiogU2NyaXB0IGEgZmFpbHVyZSByZXBseSB3aXRoIHRoaXMgY29kZSBhbmQgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXVsdChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGZhdWx0OiBPYmplY3QuZnJlZXplKHsgY29kZSwgbWVzc2FnZSB9KSB9KTtcbn1cblxuZnVuY3Rpb24gaXNGYXVsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XCJmYXVsdFwiIGluIHZhbHVlICYmXG5cdFx0dHlwZW9mICh2YWx1ZSBhcyBTY3JpcHRlZEZhdWx0KS5mYXVsdCA9PT0gXCJvYmplY3RcIlxuXHQpO1xufVxuXG4vKiogUmV0dXJuIHRoaXMgZnJvbSBhIGhhbmRsZXIgdG8gbmV2ZXIgYW5zd2VyLCBzbyB0aGUgY2xpZW50J3MgdGltZW91dCBzcGVha3MuICovXG5leHBvcnQgY29uc3QgU0lMRU5DRTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbChcInFnaXMtc2RrLWhhcm5lc3Mtc2lsZW5jZVwiKTtcblxuLyoqIEEgc3Vic2NyaXB0aW9uIHRoZSBzY3JpcHQgdHVybnMgZG93bjogYSBmYXVsdCByZXBseSwgb3Igbm8gcmVwbHkgYXQgYWxsLiAqL1xuZXhwb3J0IHR5cGUgU2NyaXB0ZWRSZWZ1c2FsID0gU2NyaXB0ZWRGYXVsdCB8IHR5cGVvZiBTSUxFTkNFO1xuXG4vKipcbiAqIEEgc3Vic2NyaWJlIGV4cGVjdGF0aW9uJ3Mgc2NyaXB0OiBlbWl0IG9uIGBzdHJlYW1gIG5vdyBvciBsYXRlciwgb3IgcmV0dXJuXG4gKiBhIHJlZnVzYWwgaW5zdGVhZCBvZiBhY2tub3dsZWRnaW5nLlxuICovXG5leHBvcnQgdHlwZSBTdWJzY3JpYmVTY3JpcHQ8UmVxIGV4dGVuZHMgb2JqZWN0PiA9IChcblx0cGF5bG9hZDogUmVxLFxuXHRzdHJlYW06IFNjcmlwdGVkU3RyZWFtLFxuXHQvLyBiaW9tZS1pZ25vcmUgbGludC9zdXNwaWNpb3VzL25vQ29uZnVzaW5nVm9pZFR5cGU6IGEgc2NyaXB0IHRoYXQgb25seSBlbWl0cyByZXR1cm5zIG5vdGhpbmdcbikgPT4gU2NyaXB0ZWRSZWZ1c2FsIHwgdm9pZDtcblxuLyoqIFdoYXQgYW4gaW52b2tlIGV4cGVjdGF0aW9uIG1heSBhbnN3ZXIgd2l0aC4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdGVkUmVwbHk8UmVzPiA9XG5cdHwgUmVzXG5cdHwgU2NyaXB0ZWRGYXVsdFxuXHR8IHR5cGVvZiBTSUxFTkNFXG5cdHwgUHJvbWlzZTxSZXMgfCBTY3JpcHRlZEZhdWx0IHwgdHlwZW9mIFNJTEVOQ0U+O1xuXG4vKiogQSBtZXNzYWdlIHRoZSBjbGllbnQgc2VudCwgYXMgdGhlIGhhcm5lc3MgcmVjb3JkZWQgaXQuICovXG5leHBvcnQgaW50ZXJmYWNlIFJlY29yZGVkQ2FsbCB7XG5cdHJlYWRvbmx5IGNhbGxJZDogc3RyaW5nO1xuXHRyZWFkb25seSBraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIiB8IFwidW5zdWJzY3JpYmVcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IHBheWxvYWQ/OiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj47XG5cdHJlYWRvbmx5IHN1YnNjcmlwdGlvbklkPzogc3RyaW5nO1xufVxuXG4vKipcbiAqIE9uZSBzY3JpcHRlZCBzdWJzY3JpcHRpb24uIEZyYW1lcyBjYXJyeSB0aGUgc2VxdWVuY2UgdGhlIGtlcm5lbCBjaGVja3MsIHNvXG4gKiBgc2tpcGAgaXMgdGhlIG9uZSB3YXkgdG8gc2NyaXB0IGEgZ2FwLlxuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkU3RyZWFtIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdC8qKiBgZmFsc2VgIG9uY2UgdGhlIGhvc3QgZW5kZWQgaXQgb3IgdGhlIHBhZ2UgY2xvc2VkIGl0LiAqL1xuXHRyZWFkb25seSBvcGVuOiBib29sZWFuO1xuXHRlbWl0KGtpbmQ6IFN0cmVhbUV2ZW50S2luZCwgcGF5bG9hZDogdW5rbm93bik6IHZvaWQ7XG5cdGVuZCh0ZXJtaW5hbDogQnJpZGdlU3RyZWFtVGVybWluYWwpOiB2b2lkO1xuXHQvKiogQWR2YW5jZSB0aGUgc2VxdWVuY2Ugd2l0aG91dCBzZW5kaW5nLCBzbyB0aGUgbmV4dCBmcmFtZSBpcyBhIGdhcC4gKi9cblx0c2tpcChmcmFtZXM6IG51bWJlcik6IHZvaWQ7XG59XG5cbi8qKiBPcHRpb25zIGZvciBhIHN1YnNjcmliZSBleHBlY3RhdGlvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgU3Vic2NyaWJlT3B0aW9ucyB7XG5cdC8qKiBEZWxheSB0aGUgYWNrbm93bGVkZ2VtZW50IHVudGlsIHRoaXMgcHJvbWlzZSBzZXR0bGVzLiAqL1xuXHRyZWFkb25seSBhY2s/OiAoKSA9PiBQcm9taXNlPHZvaWQ+O1xufVxuXG4vKipcbiAqIEEgdGVzdCdzIHNjcmlwdCB3ZW50IHdyb25nOiBhbiB1bm1ldCBvciB1bmV4cGVjdGVkIGNhbGwsIGEgbGVha2VkXG4gKiBzdWJzY3JpcHRpb24sIGEgaGFuZGxlciB0aGF0IHRocmV3LCBvciBhbiBlbnZlbG9wZSB0aGF0IGlzIG5vdCBwcm90b2NvbCAxLlxuICovXG5leHBvcnQgY2xhc3MgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvciBleHRlbmRzIFFnaXNTZGtFcnJvciB7XG5cdHB1YmxpYyBjb25zdHJ1Y3RvcihtZXNzYWdlOiBzdHJpbmcpIHtcblx0XHRzdXBlcihtZXNzYWdlLCBcImhhcm5lc3NfZXJyb3JcIik7XG5cdH1cbn1cblxuaW50ZXJmYWNlIEludm9rZUV4cGVjdGF0aW9uIHtcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIjtcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHJlYWRvbmx5IGhhbmRsZXI6IChwYXlsb2FkOiBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4pID0+IHVua25vd247XG59XG5cbmludGVyZmFjZSBTdWJzY3JpYmVFeHBlY3RhdGlvbiB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwic3Vic2NyaWJlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBzY3JpcHQ6IFN1YnNjcmliZVNjcmlwdDxSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+O1xuXHRyZWFkb25seSBvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zO1xufVxuXG50eXBlIEV4cGVjdGF0aW9uID0gSW52b2tlRXhwZWN0YXRpb24gfCBTdWJzY3JpYmVFeHBlY3RhdGlvbjtcblxuaW50ZXJmYWNlIE9wZW5TdHJlYW0ge1xuXHRyZWFkb25seSBpZDogc3RyaW5nO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0c2VxOiBudW1iZXI7XG5cdG9wZW46IGJvb2xlYW47XG59XG5cbi8qKiBUaGUgaGFybmVzcyBhIHRlc3QgaG9sZHM7IGFsc28gdGhlIHRyYW5zcG9ydCBpdHMgY2xpZW50IGlzIGJ1aWx0IG9uLiAqL1xuZXhwb3J0IGludGVyZmFjZSBCcmlkZ2VIYXJuZXNzPE9wIGV4dGVuZHMgc3RyaW5nID0gc3RyaW5nPlxuXHRleHRlbmRzIFdpcmVUcmFuc3BvcnQge1xuXHQvKiogRXZlcnkgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGluIG9yZGVyLiAqL1xuXHRyZWFkb25seSBjYWxsczogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBDYWxscyBubyBleHBlY3RhdGlvbiBjb3ZlcmVkOyBlYWNoIHdhcyBhbnN3ZXJlZCBgdW5leHBlY3RlZF9jYWxsYC4gKi9cblx0cmVhZG9ubHkgdW5leHBlY3RlZDogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW107XG5cdC8qKiBTdWJzY3JpcHRpb25zIG5laXRoZXIgZW5kZWQgYnkgYSBzY3JpcHQgbm9yIGNsb3NlZCBieSB0aGUgcGFnZS4gKi9cblx0cmVhZG9ubHkgb3BlblN1YnNjcmlwdGlvbnM6IHJlYWRvbmx5IHN0cmluZ1tdO1xuXHQvKiogQ2xpZW50cyBjdXJyZW50bHkgYXR0YWNoZWQuICovXG5cdHJlYWRvbmx5IGxpc3RlbmVyczogbnVtYmVyO1xuXHQvKiogQW5zd2VyIHRoZSBuZXh0IGBvcGVyYXRpb25gIGNhbGwgd2l0aCB3aGF0IGBoYW5kbGVyYCByZXR1cm5zLiAqL1xuXHRleHBlY3RJbnZva2U8XG5cdFx0UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+LFxuXHRcdFJlcyA9IHVua25vd24sXG5cdD4ob3BlcmF0aW9uOiBPcCwgaGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+KTogdm9pZDtcblx0LyoqXG5cdCAqIEFja25vd2xlZGdlIHRoZSBuZXh0IGBvcGVyYXRpb25gIHN1YnNjcmlwdGlvbiBhbmQgaGFuZCBgc2NyaXB0YCB0aGVcblx0ICogc3RyZWFtOyByZXR1cm4gYSBmYXVsdCBvciB7QGxpbmsgU0lMRU5DRX0gZnJvbSBpdCB0byByZWZ1c2UgaW5zdGVhZC5cblx0ICovXG5cdGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3QgPSBSZWFkb25seTxSZWNvcmQ8c3RyaW5nLCB1bmtub3duPj4+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zPzogU3Vic2NyaWJlT3B0aW9ucyxcblx0KTogdm9pZDtcblx0LyoqIFB1c2ggYW55IHJhdyBtZXNzYWdlLCBmb3Igd2hhdCBubyBleHBlY3RhdGlvbiBjYW4gc2NyaXB0LiAqL1xuXHRkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQ7XG5cdC8qKiBSZXNvbHZlIG9uY2UgZXZlcnl0aGluZyBxdWV1ZWQgc28gZmFyIGhhcyBiZWVuIGRlbGl2ZXJlZC4gKi9cblx0c2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+O1xuXHQvKiogVGhyb3cgdW5sZXNzIGV2ZXJ5IGV4cGVjdGF0aW9uIHdhcyBtZXQgYW5kIG5vdGhpbmcgbGVha2VkLiAqL1xuXHRhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZDtcbn1cblxuY2xhc3MgSGFybmVzczxPcCBleHRlbmRzIHN0cmluZz4gaW1wbGVtZW50cyBCcmlkZ2VIYXJuZXNzPE9wPiB7XG5cdHByaXZhdGUgcmVhZG9ubHkgbGlzdGVuZXJTZXQgPSBuZXcgU2V0PChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IGV4cGVjdGF0aW9uczogRXhwZWN0YXRpb25bXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHJlY29yZGVkOiBSZWNvcmRlZENhbGxbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IHVuZXhwZWN0ZWRDYWxsczogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSBzdHJlYW1zID0gbmV3IE1hcDxzdHJpbmcsIE9wZW5TdHJlYW0+KCk7XG5cdHByaXZhdGUgcmVhZG9ubHkgcHJvYmxlbXM6IHN0cmluZ1tdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgb3V0Ym94OiB1bmtub3duW10gPSBbXTtcblx0cHJpdmF0ZSBkcmFpbmluZzogUHJvbWlzZTx2b2lkPiB8IG51bGwgPSBudWxsO1xuXHRwcml2YXRlIHN0cmVhbUNvdW50ZXIgPSAwO1xuXG5cdHB1YmxpYyBnZXQgY2FsbHMoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5yZWNvcmRlZF07XG5cdH1cblxuXHRwdWJsaWMgZ2V0IHVuZXhwZWN0ZWQoKTogcmVhZG9ubHkgUmVjb3JkZWRDYWxsW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy51bmV4cGVjdGVkQ2FsbHNdO1xuXHR9XG5cblx0cHVibGljIGdldCBvcGVuU3Vic2NyaXB0aW9ucygpOiByZWFkb25seSBzdHJpbmdbXSB7XG5cdFx0cmV0dXJuIFsuLi50aGlzLnN0cmVhbXMudmFsdWVzKCldXG5cdFx0XHQuZmlsdGVyKChzdHJlYW0pID0+IHN0cmVhbS5vcGVuKVxuXHRcdFx0Lm1hcCgoc3RyZWFtKSA9PiBzdHJlYW0uaWQpO1xuXHR9XG5cblx0cHVibGljIGdldCBsaXN0ZW5lcnMoKTogbnVtYmVyIHtcblx0XHRyZXR1cm4gdGhpcy5saXN0ZW5lclNldC5zaXplO1xuXHR9XG5cblx0cHVibGljIHN1YnNjcmliZShsaXN0ZW5lcjogKG1lc3NhZ2U6IHVua25vd24pID0+IHZvaWQpOiAoKSA9PiB2b2lkIHtcblx0XHR0aGlzLmxpc3RlbmVyU2V0LmFkZChsaXN0ZW5lcik7XG5cdFx0cmV0dXJuICgpID0+IHtcblx0XHRcdHRoaXMubGlzdGVuZXJTZXQuZGVsZXRlKGxpc3RlbmVyKTtcblx0XHRcdGlmICh0aGlzLmxpc3RlbmVyU2V0LnNpemUgPT09IDApIHtcblx0XHRcdFx0Ly8gVGhlIGxhc3QgY2xpZW50IGRldGFjaGVkOiB0aGUgdmlldyBpcyBnb25lLCBhbmQgYSBob3N0IGRpc3Bvc2VzXG5cdFx0XHRcdC8vIHRoZSBzdWJzY3JpcHRpb25zIG9mIGEgdmlldyBpdCBsb3N0IChkZWNpc2lvbi0yMyksIHNvIHRoZXkgYXJlXG5cdFx0XHRcdC8vIG5vIGxvbmdlciBsZWFrcy5cblx0XHRcdFx0Zm9yIChjb25zdCBzdHJlYW0gb2YgdGhpcy5zdHJlYW1zLnZhbHVlcygpKSB7XG5cdFx0XHRcdFx0c3RyZWFtLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdH07XG5cdH1cblxuXHRwdWJsaWMgc2VuZChtZXNzYWdlOiB1bmtub3duKTogdm9pZCB7XG5cdFx0Y29uc3QgZW52ZWxvcGUgPSB0aGlzLnBhcnNlRW52ZWxvcGUobWVzc2FnZSk7XG5cdFx0aWYgKGVudmVsb3BlLmtpbmQgPT09IFwidW5zdWJzY3JpYmVcIikge1xuXHRcdFx0dGhpcy5jbG9zZUZyb21QYWdlKGVudmVsb3BlKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0Y29uc3QgZXhwZWN0YXRpb24gPSB0aGlzLnRha2UoZW52ZWxvcGUua2luZCwgZW52ZWxvcGUub3BlcmF0aW9uKTtcblx0XHRpZiAoZXhwZWN0YXRpb24gPT09IHVuZGVmaW5lZCkge1xuXHRcdFx0dGhpcy51bmV4cGVjdGVkQ2FsbHMucHVzaChlbnZlbG9wZSk7XG5cdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKFxuXHRcdFx0XHRlbnZlbG9wZS5jYWxsSWQsXG5cdFx0XHRcdFwidW5leHBlY3RlZF9jYWxsXCIsXG5cdFx0XHRcdGBubyBleHBlY3RhdGlvbiBjb3ZlcnMgJHtlbnZlbG9wZS5raW5kfSAke0pTT04uc3RyaW5naWZ5KGVudmVsb3BlLm9wZXJhdGlvbil9YCxcblx0XHRcdCk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGlmIChleHBlY3RhdGlvbi5raW5kID09PSBcImludm9rZVwiKSB7XG5cdFx0XHR0aGlzLmFuc3dlckludm9rZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmFuc3dlclN1YnNjcmliZShlbnZlbG9wZSwgZXhwZWN0YXRpb24pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdEludm9rZTxSZXEgZXh0ZW5kcyBvYmplY3QsIFJlcz4oXG5cdFx0b3BlcmF0aW9uOiBPcCxcblx0XHRoYW5kbGVyOiAocGF5bG9hZDogUmVxKSA9PiBTY3JpcHRlZFJlcGx5PFJlcz4sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJpbnZva2VcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdGhhbmRsZXI6IGhhbmRsZXIgYXMgSW52b2tlRXhwZWN0YXRpb25bXCJoYW5kbGVyXCJdLFxuXHRcdH0pO1xuXHR9XG5cblx0cHVibGljIGV4cGVjdFN1YnNjcmliZTxSZXEgZXh0ZW5kcyBvYmplY3Q+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0c2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVxPixcblx0XHRvcHRpb25zOiBTdWJzY3JpYmVPcHRpb25zID0ge30sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuZXhwZWN0YXRpb25zLnB1c2goe1xuXHRcdFx0a2luZDogXCJzdWJzY3JpYmVcIixcblx0XHRcdG9wZXJhdGlvbixcblx0XHRcdHNjcmlwdDogc2NyaXB0IGFzIFN1YnNjcmliZUV4cGVjdGF0aW9uW1wic2NyaXB0XCJdLFxuXHRcdFx0b3B0aW9ucyxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBkZWxpdmVyKHJhdzogdW5rbm93bik6IHZvaWQge1xuXHRcdHRoaXMub3V0Ym94LnB1c2gocmF3KTtcblx0XHR0aGlzLmRyYWluKCk7XG5cdH1cblxuXHRwdWJsaWMgc2V0dGxlZCgpOiBQcm9taXNlPHZvaWQ+IHtcblx0XHRyZXR1cm4gdGhpcy5kcmFpbmluZyA/PyBQcm9taXNlLnJlc29sdmUoKTtcblx0fVxuXG5cdHB1YmxpYyBhc3NlcnRTYXRpc2ZpZWQoKTogdm9pZCB7XG5cdFx0Y29uc3QgcHJvYmxlbXMgPSBbLi4udGhpcy5wcm9ibGVtc107XG5cdFx0aWYgKHRoaXMuZXhwZWN0YXRpb25zLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVubWV0ID0gdGhpcy5leHBlY3RhdGlvbnMubWFwKFxuXHRcdFx0XHQoZXhwZWN0YXRpb24pID0+IGAke2V4cGVjdGF0aW9uLmtpbmR9ICR7ZXhwZWN0YXRpb24ub3BlcmF0aW9ufWAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvYmxlbXMucHVzaChgdW5tZXQgZXhwZWN0YXRpb25zOiAke3VubWV0LmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0aWYgKHRoaXMudW5leHBlY3RlZENhbGxzLmxlbmd0aCA+IDApIHtcblx0XHRcdGNvbnN0IHVuZXhwZWN0ZWQgPSB0aGlzLnVuZXhwZWN0ZWRDYWxscy5tYXAoXG5cdFx0XHRcdChjYWxsKSA9PiBgJHtjYWxsLmtpbmR9ICR7Y2FsbC5vcGVyYXRpb259YCxcblx0XHRcdCk7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGB1bmV4cGVjdGVkIGNhbGxzOiAke3VuZXhwZWN0ZWQuam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRjb25zdCBvcGVuID0gdGhpcy5vcGVuU3Vic2NyaXB0aW9ucztcblx0XHRpZiAob3Blbi5sZW5ndGggPiAwKSB7XG5cdFx0XHRwcm9ibGVtcy5wdXNoKGBvcGVuIHN1YnNjcmlwdGlvbnM6ICR7b3Blbi5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGlmIChwcm9ibGVtcy5sZW5ndGggPiAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihwcm9ibGVtcy5qb2luKFwiOyBcIikpO1xuXHRcdH1cblx0fVxuXG5cdC8vIC0tIGFuc3dlcmluZyAtLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIGFuc3dlckludm9rZShcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0ZXhwZWN0YXRpb246IEludm9rZUV4cGVjdGF0aW9uLFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+XG5cdFx0XHRleHBlY3RhdGlvbi5oYW5kbGVyKGNhbGwucGF5bG9hZCA/PyB7fSksXG5cdFx0KS50aGVuKChyZXBseSkgPT4ge1xuXHRcdFx0aWYgKHJlcGx5ID09PSBTSUxFTkNFKSB7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdGlmIChpc0ZhdWx0KHJlcGx5KSkge1xuXHRcdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKGNhbGwuY2FsbElkLCByZXBseS5mYXVsdC5jb2RlLCByZXBseS5mYXVsdC5tZXNzYWdlKTtcblx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0fVxuXHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdHZhbHVlOiByZXBseSxcblx0XHRcdH0pO1xuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBhbnN3ZXJTdWJzY3JpYmUoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdGV4cGVjdGF0aW9uOiBTdWJzY3JpYmVFeHBlY3RhdGlvbixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5zdHJlYW1Db3VudGVyICs9IDE7XG5cdFx0Y29uc3Qgb3BlbjogT3BlblN0cmVhbSA9IHtcblx0XHRcdGlkOiBgcyR7dGhpcy5zdHJlYW1Db3VudGVyfWAsXG5cdFx0XHRvcGVyYXRpb246IGNhbGwub3BlcmF0aW9uLFxuXHRcdFx0c2VxOiAwLFxuXHRcdFx0b3BlbjogZmFsc2UsXG5cdFx0fTtcblx0XHQvLyBGcmFtZXMgdGhlIHNjcmlwdCBlbWl0cyBiZWZvcmUgdGhlIGFja25vd2xlZGdlbWVudCBpcyBkZWNpZGVkIGFyZSBoZWxkXG5cdFx0Ly8gYmFjazogYSByZWZ1c2VkIHN1YnNjcmlwdGlvbiBzZW5kcyBub25lLCBhbiBhY2NlcHRlZCBvbmUgc2VuZHMgdGhlbVxuXHRcdC8vIGFmdGVyIHRoZSBhY2tub3dsZWRnZW1lbnQsIHNvIHRoZSBrZXJuZWwgaGFzIHJlZ2lzdGVyZWQgdGhlXG5cdFx0Ly8gc3Vic2NyaXB0aW9uIGJ5IHRoZSB0aW1lIHRoZSBmaXJzdCBmcmFtZSByZWFjaGVzIGl0LlxuXHRcdGNvbnN0IGhlbGQ6IHVua25vd25bXSA9IFtdO1xuXHRcdGxldCBzaW5rID0gKGZyYW1lOiB1bmtub3duKTogdm9pZCA9PiB7XG5cdFx0XHRoZWxkLnB1c2goZnJhbWUpO1xuXHRcdH07XG5cdFx0Y29uc3Qgc3RyZWFtID0gdGhpcy5zY3JpcHRlZChvcGVuLCAoZnJhbWUpID0+IHNpbmsoZnJhbWUpKTtcblx0XHRjb25zdCBhY2sgPSBleHBlY3RhdGlvbi5vcHRpb25zLmFjayA/PyAoKCkgPT4gUHJvbWlzZS5yZXNvbHZlKCkpO1xuXHRcdGFjaygpXG5cdFx0XHQudGhlbigoKSA9PlxuXHRcdFx0XHR0aGlzLnJlc29sdmVIYW5kbGVyKGNhbGwsICgpID0+IHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSB0cnVlO1xuXHRcdFx0XHRcdHJldHVybiBleHBlY3RhdGlvbi5zY3JpcHQoY2FsbC5wYXlsb2FkID8/IHt9LCBzdHJlYW0pO1xuXHRcdFx0XHR9KSxcblx0XHRcdClcblx0XHRcdC50aGVuKChvdXRjb21lKSA9PiB7XG5cdFx0XHRcdGlmIChvdXRjb21lID09PSBTSUxFTkNFIHx8IGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0aWYgKGlzRmF1bHQob3V0Y29tZSkpIHtcblx0XHRcdFx0XHRcdHRoaXMuZGVsaXZlckZhaWx1cmUoXG5cdFx0XHRcdFx0XHRcdGNhbGwuY2FsbElkLFxuXHRcdFx0XHRcdFx0XHRvdXRjb21lLmZhdWx0LmNvZGUsXG5cdFx0XHRcdFx0XHRcdG91dGNvbWUuZmF1bHQubWVzc2FnZSxcblx0XHRcdFx0XHRcdCk7XG5cdFx0XHRcdFx0fVxuXHRcdFx0XHRcdHJldHVybjtcblx0XHRcdFx0fVxuXHRcdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdFx0Ly8gVGhlIHZpZXcgZGV0YWNoZWQgd2hpbGUgdGhlIGhvc3Qgd2FzIGRlY2lkaW5nOiBub3RoaW5nIHRvXG5cdFx0XHRcdFx0Ly8gYWNrbm93bGVkZ2UgdG8sIG5vdGhpbmcgdG8ga2VlcCBvcGVuLlxuXHRcdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0dGhpcy5zdHJlYW1zLnNldChvcGVuLmlkLCBvcGVuKTtcblx0XHRcdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRcdFx0b2s6IHRydWUsXG5cdFx0XHRcdFx0dmFsdWU6IHtcblx0XHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRcdGNhcGFjaXR5OiBTVUJTQ1JJUFRJT05fQ0FQQUNJVFksXG5cdFx0XHRcdFx0fSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdHNpbmsgPSAoZnJhbWUpID0+IHRoaXMuZGVsaXZlcihmcmFtZSk7XG5cdFx0XHRcdGZvciAoY29uc3QgZnJhbWUgb2YgaGVsZCkge1xuXHRcdFx0XHRcdHNpbmsoZnJhbWUpO1xuXHRcdFx0XHR9XG5cdFx0XHRcdGhlbGQubGVuZ3RoID0gMDtcblx0XHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSByZXNvbHZlSGFuZGxlcihcblx0XHRjYWxsOiBSZWNvcmRlZENhbGwsXG5cdFx0cnVuOiAoKSA9PiB1bmtub3duLFxuXHQpOiBQcm9taXNlPHVua25vd24+IHtcblx0XHRyZXR1cm4gbmV3IFByb21pc2U8dW5rbm93bj4oKHJlc29sdmUpID0+IHtcblx0XHRcdHJlc29sdmUocnVuKCkpO1xuXHRcdH0pLmNhdGNoKChlcnJvcjogdW5rbm93bikgPT4ge1xuXHRcdFx0Y29uc3QgbWVzc2FnZSA9IGVycm9yIGluc3RhbmNlb2YgRXJyb3IgPyBlcnJvci5tZXNzYWdlIDogU3RyaW5nKGVycm9yKTtcblx0XHRcdHRoaXMucHJvYmxlbXMucHVzaChcblx0XHRcdFx0YGhhbmRsZXIgZm9yICR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufSB0aHJldzogJHttZXNzYWdlfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuIGZhdWx0KFwiaGFybmVzc19lcnJvclwiLCBtZXNzYWdlKTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgc2NyaXB0ZWQoXG5cdFx0b3BlbjogT3BlblN0cmVhbSxcblx0XHRzaW5rOiAoZnJhbWU6IHVua25vd24pID0+IHZvaWQsXG5cdCk6IFNjcmlwdGVkU3RyZWFtIHtcblx0XHRjb25zdCByZXF1aXJlT3BlbiA9ICh2ZXJiOiBzdHJpbmcpOiB2b2lkID0+IHtcblx0XHRcdGlmICghb3Blbi5vcGVuKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGBjYW5ub3QgJHt2ZXJifSBvbiBzdWJzY3JpcHRpb24gJHtvcGVuLmlkfTogaXQgaXMgbm90IG9wZW5gLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdH07XG5cdFx0cmV0dXJuIHtcblx0XHRcdGlkOiBvcGVuLmlkLFxuXHRcdFx0b3BlcmF0aW9uOiBvcGVuLm9wZXJhdGlvbixcblx0XHRcdGdldCBvcGVuKCk6IGJvb2xlYW4ge1xuXHRcdFx0XHRyZXR1cm4gb3Blbi5vcGVuO1xuXHRcdFx0fSxcblx0XHRcdGVtaXQ6IChraW5kLCBwYXlsb2FkKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwiZW1pdFwiKTtcblx0XHRcdFx0c2luayh7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRzZXE6IG9wZW4uc2VxLFxuXHRcdFx0XHRcdGV2ZW50OiB7IGtpbmQsIHBheWxvYWQgfSxcblx0XHRcdFx0fSk7XG5cdFx0XHRcdG9wZW4uc2VxICs9IDE7XG5cdFx0XHR9LFxuXHRcdFx0ZW5kOiAodGVybWluYWwpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJlbmRcIik7XG5cdFx0XHRcdG9wZW4ub3BlbiA9IGZhbHNlO1xuXHRcdFx0XHRzaW5rKHtcblx0XHRcdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRcdFx0c3Vic2NyaXB0aW9uX2lkOiBvcGVuLmlkLFxuXHRcdFx0XHRcdHNlcTogb3Blbi5zZXEsXG5cdFx0XHRcdFx0dGVybWluYWwsXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvcGVuLnNlcSArPSAxO1xuXHRcdFx0fSxcblx0XHRcdHNraXA6IChmcmFtZXMpID0+IHtcblx0XHRcdFx0cmVxdWlyZU9wZW4oXCJza2lwXCIpO1xuXHRcdFx0XHRvcGVuLnNlcSArPSBmcmFtZXM7XG5cdFx0XHR9LFxuXHRcdH07XG5cdH1cblxuXHRwcml2YXRlIGNsb3NlRnJvbVBhZ2UoY2FsbDogUmVjb3JkZWRDYWxsKTogdm9pZCB7XG5cdFx0Y29uc3Qgb3BlbiA9XG5cdFx0XHRjYWxsLnN1YnNjcmlwdGlvbklkID09PSB1bmRlZmluZWRcblx0XHRcdFx0PyB1bmRlZmluZWRcblx0XHRcdFx0OiB0aGlzLnN0cmVhbXMuZ2V0KGNhbGwuc3Vic2NyaXB0aW9uSWQpO1xuXHRcdGNvbnN0IGRpc3Bvc2VkID0gb3Blbj8ub3BlbiA9PT0gdHJ1ZTtcblx0XHRpZiAob3BlbiAhPT0gdW5kZWZpbmVkKSB7XG5cdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHR9XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0b2s6IHRydWUsXG5cdFx0XHR2YWx1ZTogeyBkaXNwb3NlZCB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkZWxpdmVyRmFpbHVyZShjYWxsSWQ6IHN0cmluZywgY29kZTogc3RyaW5nLCBtZXNzYWdlOiBzdHJpbmcpOiB2b2lkIHtcblx0XHR0aGlzLmRlbGl2ZXIoe1xuXHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0Y2FsbF9pZDogY2FsbElkLFxuXHRcdFx0b2s6IGZhbHNlLFxuXHRcdFx0ZXJyb3I6IHsgY29kZSwgbWVzc2FnZSB9LFxuXHRcdH0pO1xuXHR9XG5cblx0cHJpdmF0ZSBkcmFpbigpOiB2b2lkIHtcblx0XHRpZiAodGhpcy5kcmFpbmluZyAhPT0gbnVsbCkge1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHR0aGlzLmRyYWluaW5nID0gKGFzeW5jICgpID0+IHtcblx0XHRcdHdoaWxlICh0aGlzLm91dGJveC5sZW5ndGggPiAwKSB7XG5cdFx0XHRcdGF3YWl0IFByb21pc2UucmVzb2x2ZSgpO1xuXHRcdFx0XHRjb25zdCBtZXNzYWdlID0gdGhpcy5vdXRib3guc2hpZnQoKTtcblx0XHRcdFx0Zm9yIChjb25zdCBsaXN0ZW5lciBvZiBbLi4udGhpcy5saXN0ZW5lclNldF0pIHtcblx0XHRcdFx0XHRsaXN0ZW5lcihtZXNzYWdlKTtcblx0XHRcdFx0fVxuXHRcdFx0fVxuXHRcdFx0dGhpcy5kcmFpbmluZyA9IG51bGw7XG5cdFx0fSkoKTtcblx0fVxuXG5cdC8vIC0tIHBhcnNpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuXG5cdHByaXZhdGUgdGFrZShcblx0XHRraW5kOiBcImludm9rZVwiIHwgXCJzdWJzY3JpYmVcIixcblx0XHRvcGVyYXRpb246IHN0cmluZyxcblx0KTogRXhwZWN0YXRpb24gfCB1bmRlZmluZWQge1xuXHRcdGNvbnN0IGluZGV4ID0gdGhpcy5leHBlY3RhdGlvbnMuZmluZEluZGV4KFxuXHRcdFx0KGV4cGVjdGF0aW9uKSA9PlxuXHRcdFx0XHRleHBlY3RhdGlvbi5raW5kID09PSBraW5kICYmIGV4cGVjdGF0aW9uLm9wZXJhdGlvbiA9PT0gb3BlcmF0aW9uLFxuXHRcdCk7XG5cdFx0aWYgKGluZGV4ID09PSAtMSkge1xuXHRcdFx0cmV0dXJuIHVuZGVmaW5lZDtcblx0XHR9XG5cdFx0cmV0dXJuIHRoaXMuZXhwZWN0YXRpb25zLnNwbGljZShpbmRleCwgMSlbMF07XG5cdH1cblxuXHRwcml2YXRlIHBhcnNlRW52ZWxvcGUobWVzc2FnZTogdW5rbm93bik6IFJlY29yZGVkQ2FsbCB7XG5cdFx0aWYgKHR5cGVvZiBtZXNzYWdlICE9PSBcIm9iamVjdFwiIHx8IG1lc3NhZ2UgPT09IG51bGwpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IGEgbm9uLW9iamVjdFwiKTtcblx0XHR9XG5cdFx0Y29uc3QgcmF3ID0gbWVzc2FnZSBhcyBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPjtcblx0XHRpZiAocmF3LnByb3RvY29sICE9PSBQUk9UT0NPTCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGB0aGUgY2xpZW50IHNwZWFrcyBwcm90b2NvbCAke1N0cmluZyhyYXcucHJvdG9jb2wpfTsgdGhlIGhhcm5lc3MgZmFrZXMgJHtQUk9UT0NPTH1gLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcuY2FsbF9pZCAhPT0gXCJzdHJpbmdcIiB8fCByYXcuY2FsbF9pZC5sZW5ndGggPT09IDApIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFwidGhlIGNsaWVudCBzZW50IG5vIGNhbGxfaWRcIik7XG5cdFx0fVxuXHRcdGNvbnN0IGNhbGxJZCA9IHJhdy5jYWxsX2lkO1xuXHRcdGlmIChyYXcua2luZCA9PT0gXCJ1bnN1YnNjcmliZVwiKSB7XG5cdFx0XHRjb25zdCBzdWJzY3JpcHRpb25JZCA9IHJhdy5zdWJzY3JpcHRpb25faWQ7XG5cdFx0XHRpZiAodHlwZW9mIHN1YnNjcmlwdGlvbklkICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRcdGAke2NhbGxJZH06IHVuc3Vic2NyaWJlIG5hbWVzIG5vIHN1YnNjcmlwdGlvbl9pZGAsXG5cdFx0XHRcdCk7XG5cdFx0XHR9XG5cdFx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7XG5cdFx0XHRcdGNhbGxJZCxcblx0XHRcdFx0a2luZDogXCJ1bnN1YnNjcmliZVwiLFxuXHRcdFx0XHRvcGVyYXRpb246IHRoaXMuc3RyZWFtcy5nZXQoc3Vic2NyaXB0aW9uSWQpPy5vcGVyYXRpb24gPz8gXCJcIixcblx0XHRcdFx0c3Vic2NyaXB0aW9uSWQsXG5cdFx0XHR9O1xuXHRcdFx0dGhpcy5yZWNvcmRlZC5wdXNoKGNhbGwpO1xuXHRcdFx0cmV0dXJuIGNhbGw7XG5cdFx0fVxuXHRcdGlmIChyYXcua2luZCAhPT0gXCJpbnZva2VcIiAmJiByYXcua2luZCAhPT0gXCJzdWJzY3JpYmVcIikge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06ICR7U3RyaW5nKHJhdy5raW5kKX0gaXMgbm90IGEgYnJpZGdlIGVudmVsb3BlIGtpbmRgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0aWYgKHR5cGVvZiByYXcub3BlcmF0aW9uICE9PSBcInN0cmluZ1wiKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0YCR7Y2FsbElkfTogb3BlcmF0aW9uIG11c3QgYmUgYSBzdHJpbmdgLFxuXHRcdFx0KTtcblx0XHR9XG5cdFx0Y29uc3QgcGF5bG9hZCA9XG5cdFx0XHR0eXBlb2YgcmF3LnBheWxvYWQgPT09IFwib2JqZWN0XCIgJiYgcmF3LnBheWxvYWQgIT09IG51bGxcblx0XHRcdFx0PyAocmF3LnBheWxvYWQgYXMgUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KVxuXHRcdFx0XHQ6IHt9O1xuXHRcdGNvbnN0IGNhbGw6IFJlY29yZGVkQ2FsbCA9IHtcblx0XHRcdGNhbGxJZCxcblx0XHRcdGtpbmQ6IHJhdy5raW5kLFxuXHRcdFx0b3BlcmF0aW9uOiByYXcub3BlcmF0aW9uLFxuXHRcdFx0cGF5bG9hZCxcblx0XHR9O1xuXHRcdHRoaXMucmVjb3JkZWQucHVzaChjYWxsKTtcblx0XHRyZXR1cm4gY2FsbDtcblx0fVxufVxuXG4vKipcbiAqIENyZWF0ZSBhIGhhcm5lc3M7IGBPcGAgbmFycm93cyB0aGUgb3BlcmF0aW9ucyBhIHRlc3QgbWF5IGV4cGVjdCwgdHlwaWNhbGx5XG4gKiB0aGUgZ2VuZXJhdGVkIG1vZHVsZSdzIGBPcGVyYXRpb25JZGAuXG4gKi9cbmV4cG9ydCBmdW5jdGlvbiBjcmVhdGVCcmlkZ2VIYXJuZXNzPFxuXHRPcCBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbj4oKTogQnJpZGdlSGFybmVzczxPcD4ge1xuXHRyZXR1cm4gbmV3IEhhcm5lc3M8T3A+KCk7XG59XG4iCiAgXSwKICAibWFwcGluZ3MiOiAiOzs7OztBQXlCQSxJQUFNLFdBQVc7QUFDakIsSUFBTSx3QkFBd0I7QUFRdkIsU0FBUyxLQUFLLENBQUMsTUFBYyxTQUFnQztBQUFBLEVBQ25FLE9BQU8sT0FBTyxPQUFPLEVBQUUsT0FBTyxPQUFPLE9BQU8sRUFBRSxNQUFNLFFBQVEsQ0FBQyxFQUFFLENBQUM7QUFBQTtBQUdqRSxTQUFTLE9B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
package/package.json CHANGED
@@ -1,10 +1,64 @@
1
1
  {
2
- "name": "@archont561/qgis-sdk",
3
- "version": "0.0.0",
4
- "description": "OIDC trusted publishing setup package for @archont561/qgis-sdk",
5
- "keywords": [
6
- "oidc",
7
- "trusted-publishing",
8
- "setup"
9
- ]
2
+ "name": "@archont561/qgis-sdk",
3
+ "version": "0.3.0",
4
+ "description": "TypeScript bridge contracts and error primitives for QGIS SDK WebEngine plugin interfaces.",
5
+ "license": "MIT",
6
+ "type": "module",
7
+ "main": "./dist/index.js",
8
+ "types": "./dist/index.d.ts",
9
+ "exports": {
10
+ ".": {
11
+ "types": "./dist/index.d.ts",
12
+ "import": "./dist/index.js",
13
+ "default": "./dist/index.js"
14
+ },
15
+ "./bridge": {
16
+ "types": "./dist/bridge.d.ts",
17
+ "import": "./dist/bridge.js",
18
+ "default": "./dist/bridge.js"
19
+ },
20
+ "./host": {
21
+ "types": "./dist/host.d.ts",
22
+ "import": "./dist/host.js",
23
+ "default": "./dist/host.js"
24
+ },
25
+ "./react": {
26
+ "types": "./dist/react.d.ts",
27
+ "import": "./dist/react.js",
28
+ "default": "./dist/react.js"
29
+ },
30
+ "./testing": {
31
+ "types": "./dist/testing.d.ts",
32
+ "import": "./dist/testing.js",
33
+ "default": "./dist/testing.js"
34
+ }
35
+ },
36
+ "files": [
37
+ "dist",
38
+ "README.md",
39
+ "LICENSE"
40
+ ],
41
+ "repository": {
42
+ "type": "git",
43
+ "url": "git+https://github.com/Archont561/qgis-sdk.git",
44
+ "directory": "packages/qgis-sdk-typescript"
45
+ },
46
+ "publishConfig": {
47
+ "access": "public"
48
+ },
49
+ "scripts": {
50
+ "build": "bunup",
51
+ "test": "bun test",
52
+ "coverage": "bun --cwd=../.. --config=bunfig.toml test --coverage packages/qgis-sdk-typescript/tests",
53
+ "typecheck": "tsc --noEmit",
54
+ "generate:contract-types": "json2ts -i 'tests/contracts/generated/schemas/*.json' -o tests/contracts/generated/types/ && json2ts -i 'tests/contracts/pydantic/generated/schemas/*.json' -o tests/contracts/pydantic/generated/types/"
55
+ },
56
+ "peerDependencies": {
57
+ "react": ">=18"
58
+ },
59
+ "peerDependenciesMeta": {
60
+ "react": {
61
+ "optional": true
62
+ }
63
+ }
10
64
  }