@archont561/qgis-sdk-bridge 0.1.1 → 0.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +35 -23
- package/dist/bridge.d.ts +205 -0
- package/dist/bridge.js +32 -0
- package/dist/host.d.ts +157 -0
- package/dist/host.js +433 -0
- package/dist/index.d.ts +22 -1
- package/dist/index.js +28 -160
- package/dist/react.d.ts +217 -0
- package/dist/react.js +196 -0
- package/dist/shared/chunk-0fknax6w.js +207 -0
- package/dist/shared/chunk-a7bjgeve.js +422 -0
- package/dist/testing.d.ts +109 -0
- package/dist/testing.js +323 -0
- package/package.json +29 -1
package/dist/testing.js
ADDED
|
@@ -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-bridge-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=61980D7265EC5FD064756E2164756E21
|
|
323
|
+
//# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsic3JjL3Rlc3RpbmcudHMiXSwKICAic291cmNlc0NvbnRlbnQiOiBbCiAgICAiLyoqXG4gKiBBbiBpbmplY3RlZCBwZXItY2xpZW50IGhhcm5lc3MgZm9yIHRoZSBicmlkZ2UgKFRBU0stMTgsIGRlY2lzaW9uLTIzKS5cbiAqXG4gKiBUaGUgaGFybmVzcyBpcyBhIHtAbGluayBXaXJlVHJhbnNwb3J0fTogYSBwYWdlJ3Mgb3duIGBCcmlkZ2VDbGllbnRgIHNwZWFrcyB0b1xuICogaXQgZXhhY3RseSBhcyBpdCB3b3VsZCB0byBhIFFXZWJDaGFubmVsLCBhbmQgYSB0ZXN0IHNjcmlwdHMgd2hhdCB0aGUgaG9zdFxuICogYW5zd2VycyAtIHR5cGVkIHJlcGxpZXMsIGZhdWx0cywgc2lsZW5jZSwgc3RyZWFtIGV2ZW50cywgdGVybWluYWxzLCBnYXBzIC1cbiAqIHdpdGhvdXQgdG91Y2hpbmcgYSBicm93c2VyIGdsb2JhbCBvciBhIHJ1bm5pbmcgUUdJUy4gVHdvIGhhcm5lc3NlcyBhcmUgdHdvXG4gKiBob3N0cywgc28gaXNvbGF0aW9uIGJldHdlZW4gY2xpZW50cyBpcyBhIGZhY3QgYSB0ZXN0IGNhbiBwcm92ZS5cbiAqXG4gKiBXaGF0IGl0IHByb3ZlcyBpcyBib3VuZGVkLiBBIGdyZWVuIHRlc3QgaGVyZSBzYXlzIHRoZSBwYWdlIGhhbmRsZXMgdGhlXG4gKiBmcmFtZXMgYSBob3N0ICpjb3VsZCogc2VuZDsgaXQgc2F5cyBub3RoaW5nIGFib3V0IHdoYXQgYSBRV2ViRW5naW5lVmlldyBvclxuICogYSByZWFsIGhvc3QgZG9lcy4gVGhhdCBldmlkZW5jZSBsaXZlcyBpbiB0aGUgUHl0aG9uIHN1aXRlIGFuZCBpbiB0aGVcbiAqIHF1YWxpZmljYXRpb24gaGFybmVzc2VzIHJlY29yZGVkIGluIGRvYy0xNC4gS2VlcCB0aGUgdHdvIGFwYXJ0IGluIHJlcG9ydHMuXG4gKlxuICogRXZlcnl0aGluZyB0aGUgaGFybmVzcyBzZW5kcyBpcyBkZWxpdmVyZWQgYXN5bmNocm9ub3VzbHksIG9uZSBtZXNzYWdlIHBlclxuICogbWljcm90YXNrLCBzbyBhIHJlcGx5IG5ldmVyIHJlLWVudGVycyB0aGUgY2xpZW50IGluc2lkZSBpdHMgb3duIGBzZW5kYC5cbiAqL1xuXG5pbXBvcnQgdHlwZSB7XG5cdEJyaWRnZVN0cmVhbVRlcm1pbmFsLFxuXHRTdHJlYW1FdmVudEtpbmQsXG5cdFdpcmVUcmFuc3BvcnQsXG59IGZyb20gXCIuL2JyaWRnZVwiO1xuaW1wb3J0IHsgUWdpc1Nka0Vycm9yIH0gZnJvbSBcIi4vaW5kZXhcIjtcblxuY29uc3QgUFJPVE9DT0wgPSAxO1xuY29uc3QgU1VCU0NSSVBUSU9OX0NBUEFDSVRZID0gNjQ7XG5cbi8qKiBBIHNjcmlwdGVkIGhvc3QgZmFpbHVyZSwgcmV0dXJuZWQgZnJvbSBhbiBleHBlY3RhdGlvbidzIGhhbmRsZXIuICovXG5leHBvcnQgaW50ZXJmYWNlIFNjcmlwdGVkRmF1bHQge1xuXHRyZWFkb25seSBmYXVsdDogeyByZWFkb25seSBjb2RlOiBzdHJpbmc7IHJlYWRvbmx5IG1lc3NhZ2U6IHN0cmluZyB9O1xufVxuXG4vKiogU2NyaXB0IGEgZmFpbHVyZSByZXBseSB3aXRoIHRoaXMgY29kZSBhbmQgbWVzc2FnZS4gKi9cbmV4cG9ydCBmdW5jdGlvbiBmYXVsdChjb2RlOiBzdHJpbmcsIG1lc3NhZ2U6IHN0cmluZyk6IFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gT2JqZWN0LmZyZWV6ZSh7IGZhdWx0OiBPYmplY3QuZnJlZXplKHsgY29kZSwgbWVzc2FnZSB9KSB9KTtcbn1cblxuZnVuY3Rpb24gaXNGYXVsdCh2YWx1ZTogdW5rbm93bik6IHZhbHVlIGlzIFNjcmlwdGVkRmF1bHQge1xuXHRyZXR1cm4gKFxuXHRcdHR5cGVvZiB2YWx1ZSA9PT0gXCJvYmplY3RcIiAmJlxuXHRcdHZhbHVlICE9PSBudWxsICYmXG5cdFx0XCJmYXVsdFwiIGluIHZhbHVlICYmXG5cdFx0dHlwZW9mICh2YWx1ZSBhcyBTY3JpcHRlZEZhdWx0KS5mYXVsdCA9PT0gXCJvYmplY3RcIlxuXHQpO1xufVxuXG4vKiogUmV0dXJuIHRoaXMgZnJvbSBhIGhhbmRsZXIgdG8gbmV2ZXIgYW5zd2VyLCBzbyB0aGUgY2xpZW50J3MgdGltZW91dCBzcGVha3MuICovXG5leHBvcnQgY29uc3QgU0lMRU5DRTogdW5pcXVlIHN5bWJvbCA9IFN5bWJvbChcInFnaXMtc2RrLWJyaWRnZS1oYXJuZXNzLXNpbGVuY2VcIik7XG5cbi8qKiBBIHN1YnNjcmlwdGlvbiB0aGUgc2NyaXB0IHR1cm5zIGRvd246IGEgZmF1bHQgcmVwbHksIG9yIG5vIHJlcGx5IGF0IGFsbC4gKi9cbmV4cG9ydCB0eXBlIFNjcmlwdGVkUmVmdXNhbCA9IFNjcmlwdGVkRmF1bHQgfCB0eXBlb2YgU0lMRU5DRTtcblxuLyoqXG4gKiBBIHN1YnNjcmliZSBleHBlY3RhdGlvbidzIHNjcmlwdDogZW1pdCBvbiBgc3RyZWFtYCBub3cgb3IgbGF0ZXIsIG9yIHJldHVyblxuICogYSByZWZ1c2FsIGluc3RlYWQgb2YgYWNrbm93bGVkZ2luZy5cbiAqL1xuZXhwb3J0IHR5cGUgU3Vic2NyaWJlU2NyaXB0PFJlcSBleHRlbmRzIG9iamVjdD4gPSAoXG5cdHBheWxvYWQ6IFJlcSxcblx0c3RyZWFtOiBTY3JpcHRlZFN0cmVhbSxcblx0Ly8gYmlvbWUtaWdub3JlIGxpbnQvc3VzcGljaW91cy9ub0NvbmZ1c2luZ1ZvaWRUeXBlOiBhIHNjcmlwdCB0aGF0IG9ubHkgZW1pdHMgcmV0dXJucyBub3RoaW5nXG4pID0+IFNjcmlwdGVkUmVmdXNhbCB8IHZvaWQ7XG5cbi8qKiBXaGF0IGFuIGludm9rZSBleHBlY3RhdGlvbiBtYXkgYW5zd2VyIHdpdGguICovXG5leHBvcnQgdHlwZSBTY3JpcHRlZFJlcGx5PFJlcz4gPVxuXHR8IFJlc1xuXHR8IFNjcmlwdGVkRmF1bHRcblx0fCB0eXBlb2YgU0lMRU5DRVxuXHR8IFByb21pc2U8UmVzIHwgU2NyaXB0ZWRGYXVsdCB8IHR5cGVvZiBTSUxFTkNFPjtcblxuLyoqIEEgbWVzc2FnZSB0aGUgY2xpZW50IHNlbnQsIGFzIHRoZSBoYXJuZXNzIHJlY29yZGVkIGl0LiAqL1xuZXhwb3J0IGludGVyZmFjZSBSZWNvcmRlZENhbGwge1xuXHRyZWFkb25seSBjYWxsSWQ6IHN0cmluZztcblx0cmVhZG9ubHkga2luZDogXCJpbnZva2VcIiB8IFwic3Vic2NyaWJlXCIgfCBcInVuc3Vic2NyaWJlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBwYXlsb2FkPzogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+O1xuXHRyZWFkb25seSBzdWJzY3JpcHRpb25JZD86IHN0cmluZztcbn1cblxuLyoqXG4gKiBPbmUgc2NyaXB0ZWQgc3Vic2NyaXB0aW9uLiBGcmFtZXMgY2FycnkgdGhlIHNlcXVlbmNlIHRoZSBrZXJuZWwgY2hlY2tzLCBzb1xuICogYHNraXBgIGlzIHRoZSBvbmUgd2F5IHRvIHNjcmlwdCBhIGdhcC5cbiAqL1xuZXhwb3J0IGludGVyZmFjZSBTY3JpcHRlZFN0cmVhbSB7XG5cdHJlYWRvbmx5IGlkOiBzdHJpbmc7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHQvKiogYGZhbHNlYCBvbmNlIHRoZSBob3N0IGVuZGVkIGl0IG9yIHRoZSBwYWdlIGNsb3NlZCBpdC4gKi9cblx0cmVhZG9ubHkgb3BlbjogYm9vbGVhbjtcblx0ZW1pdChraW5kOiBTdHJlYW1FdmVudEtpbmQsIHBheWxvYWQ6IHVua25vd24pOiB2b2lkO1xuXHRlbmQodGVybWluYWw6IEJyaWRnZVN0cmVhbVRlcm1pbmFsKTogdm9pZDtcblx0LyoqIEFkdmFuY2UgdGhlIHNlcXVlbmNlIHdpdGhvdXQgc2VuZGluZywgc28gdGhlIG5leHQgZnJhbWUgaXMgYSBnYXAuICovXG5cdHNraXAoZnJhbWVzOiBudW1iZXIpOiB2b2lkO1xufVxuXG4vKiogT3B0aW9ucyBmb3IgYSBzdWJzY3JpYmUgZXhwZWN0YXRpb24uICovXG5leHBvcnQgaW50ZXJmYWNlIFN1YnNjcmliZU9wdGlvbnMge1xuXHQvKiogRGVsYXkgdGhlIGFja25vd2xlZGdlbWVudCB1bnRpbCB0aGlzIHByb21pc2Ugc2V0dGxlcy4gKi9cblx0cmVhZG9ubHkgYWNrPzogKCkgPT4gUHJvbWlzZTx2b2lkPjtcbn1cblxuLyoqXG4gKiBBIHRlc3QncyBzY3JpcHQgd2VudCB3cm9uZzogYW4gdW5tZXQgb3IgdW5leHBlY3RlZCBjYWxsLCBhIGxlYWtlZFxuICogc3Vic2NyaXB0aW9uLCBhIGhhbmRsZXIgdGhhdCB0aHJldywgb3IgYW4gZW52ZWxvcGUgdGhhdCBpcyBub3QgcHJvdG9jb2wgMS5cbiAqL1xuZXhwb3J0IGNsYXNzIFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IgZXh0ZW5kcyBRZ2lzU2RrRXJyb3Ige1xuXHRwdWJsaWMgY29uc3RydWN0b3IobWVzc2FnZTogc3RyaW5nKSB7XG5cdFx0c3VwZXIobWVzc2FnZSwgXCJoYXJuZXNzX2Vycm9yXCIpO1xuXHR9XG59XG5cbmludGVyZmFjZSBJbnZva2VFeHBlY3RhdGlvbiB7XG5cdHJlYWRvbmx5IGtpbmQ6IFwiaW52b2tlXCI7XG5cdHJlYWRvbmx5IG9wZXJhdGlvbjogc3RyaW5nO1xuXHRyZWFkb25seSBoYW5kbGVyOiAocGF5bG9hZDogUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+KSA9PiB1bmtub3duO1xufVxuXG5pbnRlcmZhY2UgU3Vic2NyaWJlRXhwZWN0YXRpb24ge1xuXHRyZWFkb25seSBraW5kOiBcInN1YnNjcmliZVwiO1xuXHRyZWFkb25seSBvcGVyYXRpb246IHN0cmluZztcblx0cmVhZG9ubHkgc2NyaXB0OiBTdWJzY3JpYmVTY3JpcHQ8UmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pjtcblx0cmVhZG9ubHkgb3B0aW9uczogU3Vic2NyaWJlT3B0aW9ucztcbn1cblxudHlwZSBFeHBlY3RhdGlvbiA9IEludm9rZUV4cGVjdGF0aW9uIHwgU3Vic2NyaWJlRXhwZWN0YXRpb247XG5cbmludGVyZmFjZSBPcGVuU3RyZWFtIHtcblx0cmVhZG9ubHkgaWQ6IHN0cmluZztcblx0cmVhZG9ubHkgb3BlcmF0aW9uOiBzdHJpbmc7XG5cdHNlcTogbnVtYmVyO1xuXHRvcGVuOiBib29sZWFuO1xufVxuXG4vKiogVGhlIGhhcm5lc3MgYSB0ZXN0IGhvbGRzOyBhbHNvIHRoZSB0cmFuc3BvcnQgaXRzIGNsaWVudCBpcyBidWlsdCBvbi4gKi9cbmV4cG9ydCBpbnRlcmZhY2UgQnJpZGdlSGFybmVzczxPcCBleHRlbmRzIHN0cmluZyA9IHN0cmluZz5cblx0ZXh0ZW5kcyBXaXJlVHJhbnNwb3J0IHtcblx0LyoqIEV2ZXJ5IG1lc3NhZ2UgdGhlIGNsaWVudCBzZW50LCBpbiBvcmRlci4gKi9cblx0cmVhZG9ubHkgY2FsbHM6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdO1xuXHQvKiogQ2FsbHMgbm8gZXhwZWN0YXRpb24gY292ZXJlZDsgZWFjaCB3YXMgYW5zd2VyZWQgYHVuZXhwZWN0ZWRfY2FsbGAuICovXG5cdHJlYWRvbmx5IHVuZXhwZWN0ZWQ6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdO1xuXHQvKiogU3Vic2NyaXB0aW9ucyBuZWl0aGVyIGVuZGVkIGJ5IGEgc2NyaXB0IG5vciBjbG9zZWQgYnkgdGhlIHBhZ2UuICovXG5cdHJlYWRvbmx5IG9wZW5TdWJzY3JpcHRpb25zOiByZWFkb25seSBzdHJpbmdbXTtcblx0LyoqIENsaWVudHMgY3VycmVudGx5IGF0dGFjaGVkLiAqL1xuXHRyZWFkb25seSBsaXN0ZW5lcnM6IG51bWJlcjtcblx0LyoqIEFuc3dlciB0aGUgbmV4dCBgb3BlcmF0aW9uYCBjYWxsIHdpdGggd2hhdCBgaGFuZGxlcmAgcmV0dXJucy4gKi9cblx0ZXhwZWN0SW52b2tlPFxuXHRcdFJlcSBleHRlbmRzIG9iamVjdCA9IFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pixcblx0XHRSZXMgPSB1bmtub3duLFxuXHQ+KG9wZXJhdGlvbjogT3AsIGhhbmRsZXI6IChwYXlsb2FkOiBSZXEpID0+IFNjcmlwdGVkUmVwbHk8UmVzPik6IHZvaWQ7XG5cdC8qKlxuXHQgKiBBY2tub3dsZWRnZSB0aGUgbmV4dCBgb3BlcmF0aW9uYCBzdWJzY3JpcHRpb24gYW5kIGhhbmQgYHNjcmlwdGAgdGhlXG5cdCAqIHN0cmVhbTsgcmV0dXJuIGEgZmF1bHQgb3Ige0BsaW5rIFNJTEVOQ0V9IGZyb20gaXQgdG8gcmVmdXNlIGluc3RlYWQuXG5cdCAqL1xuXHRleHBlY3RTdWJzY3JpYmU8UmVxIGV4dGVuZHMgb2JqZWN0ID0gUmVhZG9ubHk8UmVjb3JkPHN0cmluZywgdW5rbm93bj4+Pihcblx0XHRvcGVyYXRpb246IE9wLFxuXHRcdHNjcmlwdDogU3Vic2NyaWJlU2NyaXB0PFJlcT4sXG5cdFx0b3B0aW9ucz86IFN1YnNjcmliZU9wdGlvbnMsXG5cdCk6IHZvaWQ7XG5cdC8qKiBQdXNoIGFueSByYXcgbWVzc2FnZSwgZm9yIHdoYXQgbm8gZXhwZWN0YXRpb24gY2FuIHNjcmlwdC4gKi9cblx0ZGVsaXZlcihyYXc6IHVua25vd24pOiB2b2lkO1xuXHQvKiogUmVzb2x2ZSBvbmNlIGV2ZXJ5dGhpbmcgcXVldWVkIHNvIGZhciBoYXMgYmVlbiBkZWxpdmVyZWQuICovXG5cdHNldHRsZWQoKTogUHJvbWlzZTx2b2lkPjtcblx0LyoqIFRocm93IHVubGVzcyBldmVyeSBleHBlY3RhdGlvbiB3YXMgbWV0IGFuZCBub3RoaW5nIGxlYWtlZC4gKi9cblx0YXNzZXJ0U2F0aXNmaWVkKCk6IHZvaWQ7XG59XG5cbmNsYXNzIEhhcm5lc3M8T3AgZXh0ZW5kcyBzdHJpbmc+IGltcGxlbWVudHMgQnJpZGdlSGFybmVzczxPcD4ge1xuXHRwcml2YXRlIHJlYWRvbmx5IGxpc3RlbmVyU2V0ID0gbmV3IFNldDwobWVzc2FnZTogdW5rbm93bikgPT4gdm9pZD4oKTtcblx0cHJpdmF0ZSByZWFkb25seSBleHBlY3RhdGlvbnM6IEV4cGVjdGF0aW9uW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSByZWNvcmRlZDogUmVjb3JkZWRDYWxsW10gPSBbXTtcblx0cHJpdmF0ZSByZWFkb25seSB1bmV4cGVjdGVkQ2FsbHM6IFJlY29yZGVkQ2FsbFtdID0gW107XG5cdHByaXZhdGUgcmVhZG9ubHkgc3RyZWFtcyA9IG5ldyBNYXA8c3RyaW5nLCBPcGVuU3RyZWFtPigpO1xuXHRwcml2YXRlIHJlYWRvbmx5IHByb2JsZW1zOiBzdHJpbmdbXSA9IFtdO1xuXHRwcml2YXRlIHJlYWRvbmx5IG91dGJveDogdW5rbm93bltdID0gW107XG5cdHByaXZhdGUgZHJhaW5pbmc6IFByb21pc2U8dm9pZD4gfCBudWxsID0gbnVsbDtcblx0cHJpdmF0ZSBzdHJlYW1Db3VudGVyID0gMDtcblxuXHRwdWJsaWMgZ2V0IGNhbGxzKCk6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMucmVjb3JkZWRdO1xuXHR9XG5cblx0cHVibGljIGdldCB1bmV4cGVjdGVkKCk6IHJlYWRvbmx5IFJlY29yZGVkQ2FsbFtdIHtcblx0XHRyZXR1cm4gWy4uLnRoaXMudW5leHBlY3RlZENhbGxzXTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgb3BlblN1YnNjcmlwdGlvbnMoKTogcmVhZG9ubHkgc3RyaW5nW10ge1xuXHRcdHJldHVybiBbLi4udGhpcy5zdHJlYW1zLnZhbHVlcygpXVxuXHRcdFx0LmZpbHRlcigoc3RyZWFtKSA9PiBzdHJlYW0ub3Blbilcblx0XHRcdC5tYXAoKHN0cmVhbSkgPT4gc3RyZWFtLmlkKTtcblx0fVxuXG5cdHB1YmxpYyBnZXQgbGlzdGVuZXJzKCk6IG51bWJlciB7XG5cdFx0cmV0dXJuIHRoaXMubGlzdGVuZXJTZXQuc2l6ZTtcblx0fVxuXG5cdHB1YmxpYyBzdWJzY3JpYmUobGlzdGVuZXI6IChtZXNzYWdlOiB1bmtub3duKSA9PiB2b2lkKTogKCkgPT4gdm9pZCB7XG5cdFx0dGhpcy5saXN0ZW5lclNldC5hZGQobGlzdGVuZXIpO1xuXHRcdHJldHVybiAoKSA9PiB7XG5cdFx0XHR0aGlzLmxpc3RlbmVyU2V0LmRlbGV0ZShsaXN0ZW5lcik7XG5cdFx0XHRpZiAodGhpcy5saXN0ZW5lclNldC5zaXplID09PSAwKSB7XG5cdFx0XHRcdC8vIFRoZSBsYXN0IGNsaWVudCBkZXRhY2hlZDogdGhlIHZpZXcgaXMgZ29uZSwgYW5kIGEgaG9zdCBkaXNwb3Nlc1xuXHRcdFx0XHQvLyB0aGUgc3Vic2NyaXB0aW9ucyBvZiBhIHZpZXcgaXQgbG9zdCAoZGVjaXNpb24tMjMpLCBzbyB0aGV5IGFyZVxuXHRcdFx0XHQvLyBubyBsb25nZXIgbGVha3MuXG5cdFx0XHRcdGZvciAoY29uc3Qgc3RyZWFtIG9mIHRoaXMuc3RyZWFtcy52YWx1ZXMoKSkge1xuXHRcdFx0XHRcdHN0cmVhbS5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHR9O1xuXHR9XG5cblx0cHVibGljIHNlbmQobWVzc2FnZTogdW5rbm93bik6IHZvaWQge1xuXHRcdGNvbnN0IGVudmVsb3BlID0gdGhpcy5wYXJzZUVudmVsb3BlKG1lc3NhZ2UpO1xuXHRcdGlmIChlbnZlbG9wZS5raW5kID09PSBcInVuc3Vic2NyaWJlXCIpIHtcblx0XHRcdHRoaXMuY2xvc2VGcm9tUGFnZShlbnZlbG9wZSk7XG5cdFx0XHRyZXR1cm47XG5cdFx0fVxuXHRcdGNvbnN0IGV4cGVjdGF0aW9uID0gdGhpcy50YWtlKGVudmVsb3BlLmtpbmQsIGVudmVsb3BlLm9wZXJhdGlvbik7XG5cdFx0aWYgKGV4cGVjdGF0aW9uID09PSB1bmRlZmluZWQpIHtcblx0XHRcdHRoaXMudW5leHBlY3RlZENhbGxzLnB1c2goZW52ZWxvcGUpO1xuXHRcdFx0dGhpcy5kZWxpdmVyRmFpbHVyZShcblx0XHRcdFx0ZW52ZWxvcGUuY2FsbElkLFxuXHRcdFx0XHRcInVuZXhwZWN0ZWRfY2FsbFwiLFxuXHRcdFx0XHRgbm8gZXhwZWN0YXRpb24gY292ZXJzICR7ZW52ZWxvcGUua2luZH0gJHtKU09OLnN0cmluZ2lmeShlbnZlbG9wZS5vcGVyYXRpb24pfWAsXG5cdFx0XHQpO1xuXHRcdFx0cmV0dXJuO1xuXHRcdH1cblx0XHRpZiAoZXhwZWN0YXRpb24ua2luZCA9PT0gXCJpbnZva2VcIikge1xuXHRcdFx0dGhpcy5hbnN3ZXJJbnZva2UoZW52ZWxvcGUsIGV4cGVjdGF0aW9uKTtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5hbnN3ZXJTdWJzY3JpYmUoZW52ZWxvcGUsIGV4cGVjdGF0aW9uKTtcblx0fVxuXG5cdHB1YmxpYyBleHBlY3RJbnZva2U8UmVxIGV4dGVuZHMgb2JqZWN0LCBSZXM+KFxuXHRcdG9wZXJhdGlvbjogT3AsXG5cdFx0aGFuZGxlcjogKHBheWxvYWQ6IFJlcSkgPT4gU2NyaXB0ZWRSZXBseTxSZXM+LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmV4cGVjdGF0aW9ucy5wdXNoKHtcblx0XHRcdGtpbmQ6IFwiaW52b2tlXCIsXG5cdFx0XHRvcGVyYXRpb24sXG5cdFx0XHRoYW5kbGVyOiBoYW5kbGVyIGFzIEludm9rZUV4cGVjdGF0aW9uW1wiaGFuZGxlclwiXSxcblx0XHR9KTtcblx0fVxuXG5cdHB1YmxpYyBleHBlY3RTdWJzY3JpYmU8UmVxIGV4dGVuZHMgb2JqZWN0Pihcblx0XHRvcGVyYXRpb246IE9wLFxuXHRcdHNjcmlwdDogU3Vic2NyaWJlU2NyaXB0PFJlcT4sXG5cdFx0b3B0aW9uczogU3Vic2NyaWJlT3B0aW9ucyA9IHt9LFxuXHQpOiB2b2lkIHtcblx0XHR0aGlzLmV4cGVjdGF0aW9ucy5wdXNoKHtcblx0XHRcdGtpbmQ6IFwic3Vic2NyaWJlXCIsXG5cdFx0XHRvcGVyYXRpb24sXG5cdFx0XHRzY3JpcHQ6IHNjcmlwdCBhcyBTdWJzY3JpYmVFeHBlY3RhdGlvbltcInNjcmlwdFwiXSxcblx0XHRcdG9wdGlvbnMsXG5cdFx0fSk7XG5cdH1cblxuXHRwdWJsaWMgZGVsaXZlcihyYXc6IHVua25vd24pOiB2b2lkIHtcblx0XHR0aGlzLm91dGJveC5wdXNoKHJhdyk7XG5cdFx0dGhpcy5kcmFpbigpO1xuXHR9XG5cblx0cHVibGljIHNldHRsZWQoKTogUHJvbWlzZTx2b2lkPiB7XG5cdFx0cmV0dXJuIHRoaXMuZHJhaW5pbmcgPz8gUHJvbWlzZS5yZXNvbHZlKCk7XG5cdH1cblxuXHRwdWJsaWMgYXNzZXJ0U2F0aXNmaWVkKCk6IHZvaWQge1xuXHRcdGNvbnN0IHByb2JsZW1zID0gWy4uLnRoaXMucHJvYmxlbXNdO1xuXHRcdGlmICh0aGlzLmV4cGVjdGF0aW9ucy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB1bm1ldCA9IHRoaXMuZXhwZWN0YXRpb25zLm1hcChcblx0XHRcdFx0KGV4cGVjdGF0aW9uKSA9PiBgJHtleHBlY3RhdGlvbi5raW5kfSAke2V4cGVjdGF0aW9uLm9wZXJhdGlvbn1gLFxuXHRcdFx0KTtcblx0XHRcdHByb2JsZW1zLnB1c2goYHVubWV0IGV4cGVjdGF0aW9uczogJHt1bm1ldC5qb2luKFwiLCBcIil9YCk7XG5cdFx0fVxuXHRcdGlmICh0aGlzLnVuZXhwZWN0ZWRDYWxscy5sZW5ndGggPiAwKSB7XG5cdFx0XHRjb25zdCB1bmV4cGVjdGVkID0gdGhpcy51bmV4cGVjdGVkQ2FsbHMubWFwKFxuXHRcdFx0XHQoY2FsbCkgPT4gYCR7Y2FsbC5raW5kfSAke2NhbGwub3BlcmF0aW9ufWAsXG5cdFx0XHQpO1xuXHRcdFx0cHJvYmxlbXMucHVzaChgdW5leHBlY3RlZCBjYWxsczogJHt1bmV4cGVjdGVkLmpvaW4oXCIsIFwiKX1gKTtcblx0XHR9XG5cdFx0Y29uc3Qgb3BlbiA9IHRoaXMub3BlblN1YnNjcmlwdGlvbnM7XG5cdFx0aWYgKG9wZW4ubGVuZ3RoID4gMCkge1xuXHRcdFx0cHJvYmxlbXMucHVzaChgb3BlbiBzdWJzY3JpcHRpb25zOiAke29wZW4uam9pbihcIiwgXCIpfWApO1xuXHRcdH1cblx0XHRpZiAocHJvYmxlbXMubGVuZ3RoID4gMCkge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IocHJvYmxlbXMuam9pbihcIjsgXCIpKTtcblx0XHR9XG5cdH1cblxuXHQvLyAtLSBhbnN3ZXJpbmcgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tXG5cblx0cHJpdmF0ZSBhbnN3ZXJJbnZva2UoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdGV4cGVjdGF0aW9uOiBJbnZva2VFeHBlY3RhdGlvbixcblx0KTogdm9pZCB7XG5cdFx0dGhpcy5yZXNvbHZlSGFuZGxlcihjYWxsLCAoKSA9PlxuXHRcdFx0ZXhwZWN0YXRpb24uaGFuZGxlcihjYWxsLnBheWxvYWQgPz8ge30pLFxuXHRcdCkudGhlbigocmVwbHkpID0+IHtcblx0XHRcdGlmIChyZXBseSA9PT0gU0lMRU5DRSkge1xuXHRcdFx0XHRyZXR1cm47XG5cdFx0XHR9XG5cdFx0XHRpZiAoaXNGYXVsdChyZXBseSkpIHtcblx0XHRcdFx0dGhpcy5kZWxpdmVyRmFpbHVyZShjYWxsLmNhbGxJZCwgcmVwbHkuZmF1bHQuY29kZSwgcmVwbHkuZmF1bHQubWVzc2FnZSk7XG5cdFx0XHRcdHJldHVybjtcblx0XHRcdH1cblx0XHRcdHRoaXMuZGVsaXZlcih7XG5cdFx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdFx0Y2FsbF9pZDogY2FsbC5jYWxsSWQsXG5cdFx0XHRcdG9rOiB0cnVlLFxuXHRcdFx0XHR2YWx1ZTogcmVwbHksXG5cdFx0XHR9KTtcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgYW5zd2VyU3Vic2NyaWJlKFxuXHRcdGNhbGw6IFJlY29yZGVkQ2FsbCxcblx0XHRleHBlY3RhdGlvbjogU3Vic2NyaWJlRXhwZWN0YXRpb24sXG5cdCk6IHZvaWQge1xuXHRcdHRoaXMuc3RyZWFtQ291bnRlciArPSAxO1xuXHRcdGNvbnN0IG9wZW46IE9wZW5TdHJlYW0gPSB7XG5cdFx0XHRpZDogYHMke3RoaXMuc3RyZWFtQ291bnRlcn1gLFxuXHRcdFx0b3BlcmF0aW9uOiBjYWxsLm9wZXJhdGlvbixcblx0XHRcdHNlcTogMCxcblx0XHRcdG9wZW46IGZhbHNlLFxuXHRcdH07XG5cdFx0Ly8gRnJhbWVzIHRoZSBzY3JpcHQgZW1pdHMgYmVmb3JlIHRoZSBhY2tub3dsZWRnZW1lbnQgaXMgZGVjaWRlZCBhcmUgaGVsZFxuXHRcdC8vIGJhY2s6IGEgcmVmdXNlZCBzdWJzY3JpcHRpb24gc2VuZHMgbm9uZSwgYW4gYWNjZXB0ZWQgb25lIHNlbmRzIHRoZW1cblx0XHQvLyBhZnRlciB0aGUgYWNrbm93bGVkZ2VtZW50LCBzbyB0aGUga2VybmVsIGhhcyByZWdpc3RlcmVkIHRoZVxuXHRcdC8vIHN1YnNjcmlwdGlvbiBieSB0aGUgdGltZSB0aGUgZmlyc3QgZnJhbWUgcmVhY2hlcyBpdC5cblx0XHRjb25zdCBoZWxkOiB1bmtub3duW10gPSBbXTtcblx0XHRsZXQgc2luayA9IChmcmFtZTogdW5rbm93bik6IHZvaWQgPT4ge1xuXHRcdFx0aGVsZC5wdXNoKGZyYW1lKTtcblx0XHR9O1xuXHRcdGNvbnN0IHN0cmVhbSA9IHRoaXMuc2NyaXB0ZWQob3BlbiwgKGZyYW1lKSA9PiBzaW5rKGZyYW1lKSk7XG5cdFx0Y29uc3QgYWNrID0gZXhwZWN0YXRpb24ub3B0aW9ucy5hY2sgPz8gKCgpID0+IFByb21pc2UucmVzb2x2ZSgpKTtcblx0XHRhY2soKVxuXHRcdFx0LnRoZW4oKCkgPT5cblx0XHRcdFx0dGhpcy5yZXNvbHZlSGFuZGxlcihjYWxsLCAoKSA9PiB7XG5cdFx0XHRcdFx0b3Blbi5vcGVuID0gdHJ1ZTtcblx0XHRcdFx0XHRyZXR1cm4gZXhwZWN0YXRpb24uc2NyaXB0KGNhbGwucGF5bG9hZCA/PyB7fSwgc3RyZWFtKTtcblx0XHRcdFx0fSksXG5cdFx0XHQpXG5cdFx0XHQudGhlbigob3V0Y29tZSkgPT4ge1xuXHRcdFx0XHRpZiAob3V0Y29tZSA9PT0gU0lMRU5DRSB8fCBpc0ZhdWx0KG91dGNvbWUpKSB7XG5cdFx0XHRcdFx0b3Blbi5vcGVuID0gZmFsc2U7XG5cdFx0XHRcdFx0aGVsZC5sZW5ndGggPSAwO1xuXHRcdFx0XHRcdGlmIChpc0ZhdWx0KG91dGNvbWUpKSB7XG5cdFx0XHRcdFx0XHR0aGlzLmRlbGl2ZXJGYWlsdXJlKFxuXHRcdFx0XHRcdFx0XHRjYWxsLmNhbGxJZCxcblx0XHRcdFx0XHRcdFx0b3V0Y29tZS5mYXVsdC5jb2RlLFxuXHRcdFx0XHRcdFx0XHRvdXRjb21lLmZhdWx0Lm1lc3NhZ2UsXG5cdFx0XHRcdFx0XHQpO1xuXHRcdFx0XHRcdH1cblx0XHRcdFx0XHRyZXR1cm47XG5cdFx0XHRcdH1cblx0XHRcdFx0aWYgKHRoaXMubGlzdGVuZXJTZXQuc2l6ZSA9PT0gMCkge1xuXHRcdFx0XHRcdC8vIFRoZSB2aWV3IGRldGFjaGVkIHdoaWxlIHRoZSBob3N0IHdhcyBkZWNpZGluZzogbm90aGluZyB0b1xuXHRcdFx0XHRcdC8vIGFja25vd2xlZGdlIHRvLCBub3RoaW5nIHRvIGtlZXAgb3Blbi5cblx0XHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHRcdFx0cmV0dXJuO1xuXHRcdFx0XHR9XG5cdFx0XHRcdHRoaXMuc3RyZWFtcy5zZXQob3Blbi5pZCwgb3Blbik7XG5cdFx0XHRcdHRoaXMuZGVsaXZlcih7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdGNhbGxfaWQ6IGNhbGwuY2FsbElkLFxuXHRcdFx0XHRcdG9rOiB0cnVlLFxuXHRcdFx0XHRcdHZhbHVlOiB7XG5cdFx0XHRcdFx0XHRzdWJzY3JpcHRpb25faWQ6IG9wZW4uaWQsXG5cdFx0XHRcdFx0XHRjYXBhY2l0eTogU1VCU0NSSVBUSU9OX0NBUEFDSVRZLFxuXHRcdFx0XHRcdH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRzaW5rID0gKGZyYW1lKSA9PiB0aGlzLmRlbGl2ZXIoZnJhbWUpO1xuXHRcdFx0XHRmb3IgKGNvbnN0IGZyYW1lIG9mIGhlbGQpIHtcblx0XHRcdFx0XHRzaW5rKGZyYW1lKTtcblx0XHRcdFx0fVxuXHRcdFx0XHRoZWxkLmxlbmd0aCA9IDA7XG5cdFx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgcmVzb2x2ZUhhbmRsZXIoXG5cdFx0Y2FsbDogUmVjb3JkZWRDYWxsLFxuXHRcdHJ1bjogKCkgPT4gdW5rbm93bixcblx0KTogUHJvbWlzZTx1bmtub3duPiB7XG5cdFx0cmV0dXJuIG5ldyBQcm9taXNlPHVua25vd24+KChyZXNvbHZlKSA9PiB7XG5cdFx0XHRyZXNvbHZlKHJ1bigpKTtcblx0XHR9KS5jYXRjaCgoZXJyb3I6IHVua25vd24pID0+IHtcblx0XHRcdGNvbnN0IG1lc3NhZ2UgPSBlcnJvciBpbnN0YW5jZW9mIEVycm9yID8gZXJyb3IubWVzc2FnZSA6IFN0cmluZyhlcnJvcik7XG5cdFx0XHR0aGlzLnByb2JsZW1zLnB1c2goXG5cdFx0XHRcdGBoYW5kbGVyIGZvciAke2NhbGwua2luZH0gJHtjYWxsLm9wZXJhdGlvbn0gdGhyZXc6ICR7bWVzc2FnZX1gLFxuXHRcdFx0KTtcblx0XHRcdHJldHVybiBmYXVsdChcImhhcm5lc3NfZXJyb3JcIiwgbWVzc2FnZSk7XG5cdFx0fSk7XG5cdH1cblxuXHRwcml2YXRlIHNjcmlwdGVkKFxuXHRcdG9wZW46IE9wZW5TdHJlYW0sXG5cdFx0c2luazogKGZyYW1lOiB1bmtub3duKSA9PiB2b2lkLFxuXHQpOiBTY3JpcHRlZFN0cmVhbSB7XG5cdFx0Y29uc3QgcmVxdWlyZU9wZW4gPSAodmVyYjogc3RyaW5nKTogdm9pZCA9PiB7XG5cdFx0XHRpZiAoIW9wZW4ub3Blbikge1xuXHRcdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0XHRgY2Fubm90ICR7dmVyYn0gb24gc3Vic2NyaXB0aW9uICR7b3Blbi5pZH06IGl0IGlzIG5vdCBvcGVuYCxcblx0XHRcdFx0KTtcblx0XHRcdH1cblx0XHR9O1xuXHRcdHJldHVybiB7XG5cdFx0XHRpZDogb3Blbi5pZCxcblx0XHRcdG9wZXJhdGlvbjogb3Blbi5vcGVyYXRpb24sXG5cdFx0XHRnZXQgb3BlbigpOiBib29sZWFuIHtcblx0XHRcdFx0cmV0dXJuIG9wZW4ub3Blbjtcblx0XHRcdH0sXG5cdFx0XHRlbWl0OiAoa2luZCwgcGF5bG9hZCkgPT4ge1xuXHRcdFx0XHRyZXF1aXJlT3BlbihcImVtaXRcIik7XG5cdFx0XHRcdHNpbmsoe1xuXHRcdFx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdFx0XHRzdWJzY3JpcHRpb25faWQ6IG9wZW4uaWQsXG5cdFx0XHRcdFx0c2VxOiBvcGVuLnNlcSxcblx0XHRcdFx0XHRldmVudDogeyBraW5kLCBwYXlsb2FkIH0sXG5cdFx0XHRcdH0pO1xuXHRcdFx0XHRvcGVuLnNlcSArPSAxO1xuXHRcdFx0fSxcblx0XHRcdGVuZDogKHRlcm1pbmFsKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwiZW5kXCIpO1xuXHRcdFx0XHRvcGVuLm9wZW4gPSBmYWxzZTtcblx0XHRcdFx0c2luayh7XG5cdFx0XHRcdFx0cHJvdG9jb2w6IFBST1RPQ09MLFxuXHRcdFx0XHRcdHN1YnNjcmlwdGlvbl9pZDogb3Blbi5pZCxcblx0XHRcdFx0XHRzZXE6IG9wZW4uc2VxLFxuXHRcdFx0XHRcdHRlcm1pbmFsLFxuXHRcdFx0XHR9KTtcblx0XHRcdFx0b3Blbi5zZXEgKz0gMTtcblx0XHRcdH0sXG5cdFx0XHRza2lwOiAoZnJhbWVzKSA9PiB7XG5cdFx0XHRcdHJlcXVpcmVPcGVuKFwic2tpcFwiKTtcblx0XHRcdFx0b3Blbi5zZXEgKz0gZnJhbWVzO1xuXHRcdFx0fSxcblx0XHR9O1xuXHR9XG5cblx0cHJpdmF0ZSBjbG9zZUZyb21QYWdlKGNhbGw6IFJlY29yZGVkQ2FsbCk6IHZvaWQge1xuXHRcdGNvbnN0IG9wZW4gPVxuXHRcdFx0Y2FsbC5zdWJzY3JpcHRpb25JZCA9PT0gdW5kZWZpbmVkXG5cdFx0XHRcdD8gdW5kZWZpbmVkXG5cdFx0XHRcdDogdGhpcy5zdHJlYW1zLmdldChjYWxsLnN1YnNjcmlwdGlvbklkKTtcblx0XHRjb25zdCBkaXNwb3NlZCA9IG9wZW4/Lm9wZW4gPT09IHRydWU7XG5cdFx0aWYgKG9wZW4gIT09IHVuZGVmaW5lZCkge1xuXHRcdFx0b3Blbi5vcGVuID0gZmFsc2U7XG5cdFx0fVxuXHRcdHRoaXMuZGVsaXZlcih7XG5cdFx0XHRwcm90b2NvbDogUFJPVE9DT0wsXG5cdFx0XHRjYWxsX2lkOiBjYWxsLmNhbGxJZCxcblx0XHRcdG9rOiB0cnVlLFxuXHRcdFx0dmFsdWU6IHsgZGlzcG9zZWQgfSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZGVsaXZlckZhaWx1cmUoY2FsbElkOiBzdHJpbmcsIGNvZGU6IHN0cmluZywgbWVzc2FnZTogc3RyaW5nKTogdm9pZCB7XG5cdFx0dGhpcy5kZWxpdmVyKHtcblx0XHRcdHByb3RvY29sOiBQUk9UT0NPTCxcblx0XHRcdGNhbGxfaWQ6IGNhbGxJZCxcblx0XHRcdG9rOiBmYWxzZSxcblx0XHRcdGVycm9yOiB7IGNvZGUsIG1lc3NhZ2UgfSxcblx0XHR9KTtcblx0fVxuXG5cdHByaXZhdGUgZHJhaW4oKTogdm9pZCB7XG5cdFx0aWYgKHRoaXMuZHJhaW5pbmcgIT09IG51bGwpIHtcblx0XHRcdHJldHVybjtcblx0XHR9XG5cdFx0dGhpcy5kcmFpbmluZyA9IChhc3luYyAoKSA9PiB7XG5cdFx0XHR3aGlsZSAodGhpcy5vdXRib3gubGVuZ3RoID4gMCkge1xuXHRcdFx0XHRhd2FpdCBQcm9taXNlLnJlc29sdmUoKTtcblx0XHRcdFx0Y29uc3QgbWVzc2FnZSA9IHRoaXMub3V0Ym94LnNoaWZ0KCk7XG5cdFx0XHRcdGZvciAoY29uc3QgbGlzdGVuZXIgb2YgWy4uLnRoaXMubGlzdGVuZXJTZXRdKSB7XG5cdFx0XHRcdFx0bGlzdGVuZXIobWVzc2FnZSk7XG5cdFx0XHRcdH1cblx0XHRcdH1cblx0XHRcdHRoaXMuZHJhaW5pbmcgPSBudWxsO1xuXHRcdH0pKCk7XG5cdH1cblxuXHQvLyAtLSBwYXJzaW5nIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cblxuXHRwcml2YXRlIHRha2UoXG5cdFx0a2luZDogXCJpbnZva2VcIiB8IFwic3Vic2NyaWJlXCIsXG5cdFx0b3BlcmF0aW9uOiBzdHJpbmcsXG5cdCk6IEV4cGVjdGF0aW9uIHwgdW5kZWZpbmVkIHtcblx0XHRjb25zdCBpbmRleCA9IHRoaXMuZXhwZWN0YXRpb25zLmZpbmRJbmRleChcblx0XHRcdChleHBlY3RhdGlvbikgPT5cblx0XHRcdFx0ZXhwZWN0YXRpb24ua2luZCA9PT0ga2luZCAmJiBleHBlY3RhdGlvbi5vcGVyYXRpb24gPT09IG9wZXJhdGlvbixcblx0XHQpO1xuXHRcdGlmIChpbmRleCA9PT0gLTEpIHtcblx0XHRcdHJldHVybiB1bmRlZmluZWQ7XG5cdFx0fVxuXHRcdHJldHVybiB0aGlzLmV4cGVjdGF0aW9ucy5zcGxpY2UoaW5kZXgsIDEpWzBdO1xuXHR9XG5cblx0cHJpdmF0ZSBwYXJzZUVudmVsb3BlKG1lc3NhZ2U6IHVua25vd24pOiBSZWNvcmRlZENhbGwge1xuXHRcdGlmICh0eXBlb2YgbWVzc2FnZSAhPT0gXCJvYmplY3RcIiB8fCBtZXNzYWdlID09PSBudWxsKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcInRoZSBjbGllbnQgc2VudCBhIG5vbi1vYmplY3RcIik7XG5cdFx0fVxuXHRcdGNvbnN0IHJhdyA9IG1lc3NhZ2UgYXMgUmVjb3JkPHN0cmluZywgdW5rbm93bj47XG5cdFx0aWYgKHJhdy5wcm90b2NvbCAhPT0gUFJPVE9DT0wpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRgdGhlIGNsaWVudCBzcGVha3MgcHJvdG9jb2wgJHtTdHJpbmcocmF3LnByb3RvY29sKX07IHRoZSBoYXJuZXNzIGZha2VzICR7UFJPVE9DT0x9YCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgcmF3LmNhbGxfaWQgIT09IFwic3RyaW5nXCIgfHwgcmF3LmNhbGxfaWQubGVuZ3RoID09PSAwKSB7XG5cdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcInRoZSBjbGllbnQgc2VudCBubyBjYWxsX2lkXCIpO1xuXHRcdH1cblx0XHRjb25zdCBjYWxsSWQgPSByYXcuY2FsbF9pZDtcblx0XHRpZiAocmF3LmtpbmQgPT09IFwidW5zdWJzY3JpYmVcIikge1xuXHRcdFx0Y29uc3Qgc3Vic2NyaXB0aW9uSWQgPSByYXcuc3Vic2NyaXB0aW9uX2lkO1xuXHRcdFx0aWYgKHR5cGVvZiBzdWJzY3JpcHRpb25JZCAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0XHR0aHJvdyBuZXcgUWdpc1Nka0JyaWRnZUhhcm5lc3NFcnJvcihcblx0XHRcdFx0XHRgJHtjYWxsSWR9OiB1bnN1YnNjcmliZSBuYW1lcyBubyBzdWJzY3JpcHRpb25faWRgLFxuXHRcdFx0XHQpO1xuXHRcdFx0fVxuXHRcdFx0Y29uc3QgY2FsbDogUmVjb3JkZWRDYWxsID0ge1xuXHRcdFx0XHRjYWxsSWQsXG5cdFx0XHRcdGtpbmQ6IFwidW5zdWJzY3JpYmVcIixcblx0XHRcdFx0b3BlcmF0aW9uOiB0aGlzLnN0cmVhbXMuZ2V0KHN1YnNjcmlwdGlvbklkKT8ub3BlcmF0aW9uID8/IFwiXCIsXG5cdFx0XHRcdHN1YnNjcmlwdGlvbklkLFxuXHRcdFx0fTtcblx0XHRcdHRoaXMucmVjb3JkZWQucHVzaChjYWxsKTtcblx0XHRcdHJldHVybiBjYWxsO1xuXHRcdH1cblx0XHRpZiAocmF3LmtpbmQgIT09IFwiaW52b2tlXCIgJiYgcmF3LmtpbmQgIT09IFwic3Vic2NyaWJlXCIpIHtcblx0XHRcdHRocm93IG5ldyBRZ2lzU2RrQnJpZGdlSGFybmVzc0Vycm9yKFxuXHRcdFx0XHRgJHtjYWxsSWR9OiAke1N0cmluZyhyYXcua2luZCl9IGlzIG5vdCBhIGJyaWRnZSBlbnZlbG9wZSBraW5kYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGlmICh0eXBlb2YgcmF3Lm9wZXJhdGlvbiAhPT0gXCJzdHJpbmdcIikge1xuXHRcdFx0dGhyb3cgbmV3IFFnaXNTZGtCcmlkZ2VIYXJuZXNzRXJyb3IoXG5cdFx0XHRcdGAke2NhbGxJZH06IG9wZXJhdGlvbiBtdXN0IGJlIGEgc3RyaW5nYCxcblx0XHRcdCk7XG5cdFx0fVxuXHRcdGNvbnN0IHBheWxvYWQgPVxuXHRcdFx0dHlwZW9mIHJhdy5wYXlsb2FkID09PSBcIm9iamVjdFwiICYmIHJhdy5wYXlsb2FkICE9PSBudWxsXG5cdFx0XHRcdD8gKHJhdy5wYXlsb2FkIGFzIFJlYWRvbmx5PFJlY29yZDxzdHJpbmcsIHVua25vd24+Pilcblx0XHRcdFx0OiB7fTtcblx0XHRjb25zdCBjYWxsOiBSZWNvcmRlZENhbGwgPSB7XG5cdFx0XHRjYWxsSWQsXG5cdFx0XHRraW5kOiByYXcua2luZCxcblx0XHRcdG9wZXJhdGlvbjogcmF3Lm9wZXJhdGlvbixcblx0XHRcdHBheWxvYWQsXG5cdFx0fTtcblx0XHR0aGlzLnJlY29yZGVkLnB1c2goY2FsbCk7XG5cdFx0cmV0dXJuIGNhbGw7XG5cdH1cbn1cblxuLyoqXG4gKiBDcmVhdGUgYSBoYXJuZXNzOyBgT3BgIG5hcnJvd3MgdGhlIG9wZXJhdGlvbnMgYSB0ZXN0IG1heSBleHBlY3QsIHR5cGljYWxseVxuICogdGhlIGdlbmVyYXRlZCBtb2R1bGUncyBgT3BlcmF0aW9uSWRgLlxuICovXG5leHBvcnQgZnVuY3Rpb24gY3JlYXRlQnJpZGdlSGFybmVzczxcblx0T3AgZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4+KCk6IEJyaWRnZUhhcm5lc3M8T3A+IHtcblx0cmV0dXJuIG5ldyBIYXJuZXNzPE9wPigpO1xufVxuIgogIF0sCiAgIm1hcHBpbmdzIjogIjs7Ozs7QUF5QkEsSUFBTSxXQUFXO0FBQ2pCLElBQU0sd0JBQXdCO0FBUXZCLFNBQVMsS0FBSyxDQUFDLE1BQWMsU0FBZ0M7QUFBQSxFQUNuRSxPQUFPLE9BQU8sT0FBTyxFQUFFLE9BQU8sT0FBTyxPQUFPLEVBQUUsTUFBTSxRQUFRLENBQUMsRUFBRSxDQUFDO0FBQUE7QUFHakUs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
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@archont561/qgis-sdk-bridge",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.2.0",
|
|
4
4
|
"description": "TypeScript bridge contracts and error primitives for QGIS SDK WebEngine plugin interfaces.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"type": "module",
|
|
@@ -11,6 +11,26 @@
|
|
|
11
11
|
"types": "./dist/index.d.ts",
|
|
12
12
|
"import": "./dist/index.js",
|
|
13
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"
|
|
14
34
|
}
|
|
15
35
|
},
|
|
16
36
|
"files": [
|
|
@@ -32,5 +52,13 @@
|
|
|
32
52
|
"coverage": "bun --cwd=../.. --config=bunfig.toml test --coverage packages/qgis-sdk-bridge/tests",
|
|
33
53
|
"typecheck": "tsc --noEmit",
|
|
34
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
|
+
}
|
|
35
63
|
}
|
|
36
64
|
}
|