@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.
- package/LICENSE +21 -0
- package/README.md +41 -30
- 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 +106 -0
- package/dist/index.js +31 -0
- 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 +62 -8
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-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
|
-
|
|
3
|
-
|
|
4
|
-
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
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
|
}
|