@kaspernj/api-maker 1.0.2121 → 1.0.2123
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 +45 -0
- package/build/channels-consumer.d.ts +1 -0
- package/build/channels-consumer.d.ts.map +1 -1
- package/build/channels-consumer.js +9 -2
- package/build/command-execution.d.ts +71 -0
- package/build/command-execution.d.ts.map +1 -0
- package/build/command-execution.js +138 -0
- package/build/commands-pool.d.ts +8 -4
- package/build/commands-pool.d.ts.map +1 -1
- package/build/commands-pool.js +58 -40
- package/build/config.d.ts +14 -0
- package/build/config.d.ts.map +1 -1
- package/build/config.js +17 -2
- package/build/devise.d.ts.map +1 -1
- package/build/devise.js +18 -4
- package/build/inputs/attachment.js +11 -3
- package/build/link.js +2 -2
- package/build/model-recipes-model-loader.d.ts.map +1 -1
- package/build/model-recipes-model-loader.js +5 -3
- package/build/session-status-updater.d.ts +5 -0
- package/build/session-status-updater.d.ts.map +1 -1
- package/build/session-status-updater.js +14 -3
- package/build/table/filters/load-search-modal.js +2 -2
- package/build/table/filters/save-search-modal.js +2 -2
- package/build/websocket-request-client.d.ts +55 -0
- package/build/websocket-request-client.d.ts.map +1 -0
- package/build/websocket-request-client.js +192 -0
- package/package.json +15 -5
|
@@ -0,0 +1,192 @@
|
|
|
1
|
+
import CustomError from "./custom-error.js";
|
|
2
|
+
import Logger from "./logger.js";
|
|
3
|
+
import channelsConsumer from "./channels-consumer.js";
|
|
4
|
+
const logger = new Logger({ name: "ApiMaker / WebsocketRequestClient" });
|
|
5
|
+
const shared = {};
|
|
6
|
+
/** Shared websocket request client for ApiMaker command/service execution. */
|
|
7
|
+
export default class ApiMakerWebsocketRequestClient {
|
|
8
|
+
/** @returns {ApiMakerWebsocketRequestClient} */
|
|
9
|
+
static current() {
|
|
10
|
+
if (!shared.currentApiMakerWebsocketRequestClient) {
|
|
11
|
+
shared.currentApiMakerWebsocketRequestClient = new ApiMakerWebsocketRequestClient();
|
|
12
|
+
}
|
|
13
|
+
return shared.currentApiMakerWebsocketRequestClient;
|
|
14
|
+
}
|
|
15
|
+
/** Constructor. */
|
|
16
|
+
constructor() {
|
|
17
|
+
this.currentRequestId = 1;
|
|
18
|
+
this.pendingRequests = {};
|
|
19
|
+
this.pendingRequestsByFingerprint = {};
|
|
20
|
+
this.responseCache = {};
|
|
21
|
+
this.subscriptionState = "new";
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* @param {object} args
|
|
25
|
+
* @param {boolean} [args.cacheResponse]
|
|
26
|
+
* @param {Record<string, any>} [args.global]
|
|
27
|
+
* @param {(value: string) => void} [args.onLog]
|
|
28
|
+
* @param {(value: Record<string, any>) => void} [args.onProgress]
|
|
29
|
+
* @param {(value: Record<string, any>) => void} [args.onReceived]
|
|
30
|
+
* @param {Record<string, any>} args.request
|
|
31
|
+
* @returns {Promise<Record<string, any>>}
|
|
32
|
+
*/
|
|
33
|
+
perform({ cacheResponse, global, onLog, onProgress, onReceived, request }) {
|
|
34
|
+
const fingerprint = JSON.stringify({ global, request });
|
|
35
|
+
if (cacheResponse && this.responseCache[fingerprint]) {
|
|
36
|
+
return Promise.resolve(this.responseCache[fingerprint]);
|
|
37
|
+
}
|
|
38
|
+
if (this.pendingRequestsByFingerprint[fingerprint]) {
|
|
39
|
+
const pendingRequestData = this.pendingRequestsByFingerprint[fingerprint];
|
|
40
|
+
const pendingRequest = this.pendingRequests[pendingRequestData.requestId];
|
|
41
|
+
if (onLog)
|
|
42
|
+
pendingRequest?.onLogCallbacks.push(onLog);
|
|
43
|
+
if (onProgress)
|
|
44
|
+
pendingRequest?.onProgressCallbacks.push(onProgress);
|
|
45
|
+
if (onReceived)
|
|
46
|
+
pendingRequest?.onReceivedCallbacks.push(onReceived);
|
|
47
|
+
return pendingRequestData.promise;
|
|
48
|
+
}
|
|
49
|
+
const promise = new Promise((resolve, reject) => {
|
|
50
|
+
const requestId = this.currentRequestId;
|
|
51
|
+
this.currentRequestId += 1;
|
|
52
|
+
this.pendingRequests[requestId] = {
|
|
53
|
+
cacheResponse,
|
|
54
|
+
fingerprint,
|
|
55
|
+
onLogCallbacks: onLog ? [onLog] : [],
|
|
56
|
+
onProgressCallbacks: onProgress ? [onProgress] : [],
|
|
57
|
+
onReceivedCallbacks: onReceived ? [onReceived] : [],
|
|
58
|
+
reject,
|
|
59
|
+
resolve
|
|
60
|
+
};
|
|
61
|
+
this.waitForSubscription().then(() => {
|
|
62
|
+
this.ensureSubscription().perform("execute", {
|
|
63
|
+
cache_response: cacheResponse,
|
|
64
|
+
global,
|
|
65
|
+
request,
|
|
66
|
+
request_id: requestId
|
|
67
|
+
});
|
|
68
|
+
})
|
|
69
|
+
.catch((error) => {
|
|
70
|
+
delete this.pendingRequests[requestId];
|
|
71
|
+
reject(error);
|
|
72
|
+
});
|
|
73
|
+
});
|
|
74
|
+
this.pendingRequestsByFingerprint[fingerprint] = { promise, requestId: this.currentRequestId - 1 };
|
|
75
|
+
promise.then(() => {
|
|
76
|
+
delete this.pendingRequestsByFingerprint[fingerprint];
|
|
77
|
+
}, () => {
|
|
78
|
+
delete this.pendingRequestsByFingerprint[fingerprint];
|
|
79
|
+
});
|
|
80
|
+
return promise;
|
|
81
|
+
}
|
|
82
|
+
/** @returns {any} */
|
|
83
|
+
ensureSubscription() {
|
|
84
|
+
if (!this.subscription) {
|
|
85
|
+
logger.debug("Creating websocket request subscription");
|
|
86
|
+
this.subscriptionState = "connecting";
|
|
87
|
+
this.resetSubscriptionReadyPromise();
|
|
88
|
+
this.subscription = channelsConsumer().subscriptions.create({ channel: "ApiMaker::RequestsChannel" }, {
|
|
89
|
+
connected: this.onConnected,
|
|
90
|
+
disconnected: this.onDisconnected,
|
|
91
|
+
received: this.onReceived,
|
|
92
|
+
rejected: this.onRejected
|
|
93
|
+
});
|
|
94
|
+
}
|
|
95
|
+
return this.subscription;
|
|
96
|
+
}
|
|
97
|
+
/** @returns {Promise<void>} */
|
|
98
|
+
waitForSubscription() {
|
|
99
|
+
this.ensureSubscription();
|
|
100
|
+
if (this.subscriptionState == "connected") {
|
|
101
|
+
return Promise.resolve();
|
|
102
|
+
}
|
|
103
|
+
if (!this.subscriptionReadyPromise) {
|
|
104
|
+
this.resetSubscriptionReadyPromise();
|
|
105
|
+
}
|
|
106
|
+
return this.subscriptionReadyPromise;
|
|
107
|
+
}
|
|
108
|
+
/** @returns {void} */
|
|
109
|
+
resetSubscriptionReadyPromise() {
|
|
110
|
+
this.subscriptionReadyPromise = new Promise((resolve, reject) => {
|
|
111
|
+
this.resolveSubscriptionReadyPromise = resolve;
|
|
112
|
+
this.rejectSubscriptionReadyPromise = reject;
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/** @returns {void} */
|
|
116
|
+
onConnected = () => {
|
|
117
|
+
logger.debug("Websocket request subscription connected");
|
|
118
|
+
this.subscriptionState = "connected";
|
|
119
|
+
this.resolveSubscriptionReadyPromise?.();
|
|
120
|
+
};
|
|
121
|
+
/** @returns {void} */
|
|
122
|
+
onDisconnected = () => {
|
|
123
|
+
logger.debug("Websocket request subscription disconnected");
|
|
124
|
+
this.rejectPendingRequests(new Error("Websocket request subscription disconnected"));
|
|
125
|
+
this.subscriptionState = "disconnected";
|
|
126
|
+
this.subscription = null;
|
|
127
|
+
this.resetSubscriptionReadyPromise();
|
|
128
|
+
};
|
|
129
|
+
/** @returns {void} */
|
|
130
|
+
onRejected = () => {
|
|
131
|
+
const error = new Error("Websocket request subscription was rejected");
|
|
132
|
+
logger.error(error);
|
|
133
|
+
this.rejectPendingRequests(error);
|
|
134
|
+
this.subscriptionState = "rejected";
|
|
135
|
+
this.subscription = null;
|
|
136
|
+
this.rejectSubscriptionReadyPromise?.(error);
|
|
137
|
+
this.resetSubscriptionReadyPromise();
|
|
138
|
+
};
|
|
139
|
+
/**
|
|
140
|
+
* @param {Record<string, any>} data
|
|
141
|
+
* @returns {void}
|
|
142
|
+
*/
|
|
143
|
+
onReceived = (data) => {
|
|
144
|
+
const pendingRequest = this.pendingRequests[data.request_id];
|
|
145
|
+
if (!pendingRequest) {
|
|
146
|
+
logger.debug(() => ["Ignoring websocket response without a pending request", { data }]);
|
|
147
|
+
return;
|
|
148
|
+
}
|
|
149
|
+
if (data.type == "api_maker_command_log") {
|
|
150
|
+
pendingRequest.onLogCallbacks.forEach((callback) => callback(data.message));
|
|
151
|
+
}
|
|
152
|
+
else if (data.type == "api_maker_command_progress") {
|
|
153
|
+
const progressData = {
|
|
154
|
+
count: data.count,
|
|
155
|
+
progress: data.progress,
|
|
156
|
+
total: data.total
|
|
157
|
+
};
|
|
158
|
+
pendingRequest.onProgressCallbacks.forEach((callback) => callback(progressData));
|
|
159
|
+
}
|
|
160
|
+
else if (data.type == "api_maker_request_received") {
|
|
161
|
+
pendingRequest.onReceivedCallbacks.forEach((callback) => callback(data));
|
|
162
|
+
}
|
|
163
|
+
else if (data.type == "api_maker_request_response") {
|
|
164
|
+
delete this.pendingRequests[data.request_id];
|
|
165
|
+
if (pendingRequest.cacheResponse) {
|
|
166
|
+
this.responseCache[pendingRequest.fingerprint] = data.response;
|
|
167
|
+
}
|
|
168
|
+
pendingRequest.resolve(data.response);
|
|
169
|
+
}
|
|
170
|
+
else if (data.type == "api_maker_request_error") {
|
|
171
|
+
delete this.pendingRequests[data.request_id];
|
|
172
|
+
pendingRequest.reject(new CustomError("Websocket request failed", { response: data.response }));
|
|
173
|
+
}
|
|
174
|
+
else {
|
|
175
|
+
delete this.pendingRequests[data.request_id];
|
|
176
|
+
pendingRequest.reject(new Error(`Unknown websocket request response type: ${data.type}`));
|
|
177
|
+
}
|
|
178
|
+
};
|
|
179
|
+
/**
|
|
180
|
+
* @param {Error} error
|
|
181
|
+
* @returns {void}
|
|
182
|
+
*/
|
|
183
|
+
rejectPendingRequests(error) {
|
|
184
|
+
const pendingRequests = this.pendingRequests;
|
|
185
|
+
this.pendingRequests = {};
|
|
186
|
+
this.pendingRequestsByFingerprint = {};
|
|
187
|
+
Object.values(pendingRequests).forEach((pendingRequest) => {
|
|
188
|
+
queueMicrotask(() => pendingRequest.reject(error));
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
}
|
|
192
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoid2Vic29ja2V0LXJlcXVlc3QtY2xpZW50LmpzIiwic291cmNlUm9vdCI6Ii9zcmMvIiwic291cmNlcyI6WyJ3ZWJzb2NrZXQtcmVxdWVzdC1jbGllbnQuanMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsT0FBTyxXQUFXLE1BQU0sbUJBQW1CLENBQUE7QUFDM0MsT0FBTyxNQUFNLE1BQU0sYUFBYSxDQUFBO0FBQ2hDLE9BQU8sZ0JBQWdCLE1BQU0sd0JBQXdCLENBQUE7QUFFckQsTUFBTSxNQUFNLEdBQUcsSUFBSSxNQUFNLENBQUMsRUFBQyxJQUFJLEVBQUUsbUNBQW1DLEVBQUMsQ0FBQyxDQUFBO0FBQ3RFLE1BQU0sTUFBTSxHQUFHLEVBQUUsQ0FBQTtBQUVqQiw4RUFBOEU7QUFDOUUsTUFBTSxDQUFDLE9BQU8sT0FBTyw4QkFBOEI7SUFDakQsZ0RBQWdEO0lBQ2hELE1BQU0sQ0FBQyxPQUFPO1FBQ1osSUFBSSxDQUFDLE1BQU0sQ0FBQyxxQ0FBcUMsRUFBRSxDQUFDO1lBQ2xELE1BQU0sQ0FBQyxxQ0FBcUMsR0FBRyxJQUFJLDhCQUE4QixFQUFFLENBQUE7UUFDckYsQ0FBQztRQUVELE9BQU8sTUFBTSxDQUFDLHFDQUFxQyxDQUFBO0lBQ3JELENBQUM7SUFFRCxtQkFBbUI7SUFDbkI7UUFDRSxJQUFJLENBQUMsZ0JBQWdCLEdBQUcsQ0FBQyxDQUFBO1FBQ3pCLElBQUksQ0FBQyxlQUFlLEdBQUcsRUFBRSxDQUFBO1FBQ3pCLElBQUksQ0FBQyw0QkFBNEIsR0FBRyxFQUFFLENBQUE7UUFDdEMsSUFBSSxDQUFDLGFBQWEsR0FBRyxFQUFFLENBQUE7UUFDdkIsSUFBSSxDQUFDLGlCQUFpQixHQUFHLEtBQUssQ0FBQTtJQUNoQyxDQUFDO0lBRUQ7Ozs7Ozs7OztPQVNHO0lBQ0gsT0FBTyxDQUFFLEVBQUMsYUFBYSxFQUFFLE1BQU0sRUFBRSxLQUFLLEVBQUUsVUFBVSxFQUFFLFVBQVUsRUFBRSxPQUFPLEVBQUM7UUFDdEUsTUFBTSxXQUFXLEdBQUcsSUFB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ZXJyb3IuanNcIlxuaW1wb3J0IExvZ2dlciBmcm9tIFwiLi9sb2dnZXIuanNcIlxuaW1wb3J0IGNoYW5uZWxzQ29uc3VtZXIgZnJvbSBcIi4vY2hhbm5lbHMtY29uc3VtZXIuanNcIlxuXG5jb25zdCBsb2dnZXIgPSBuZXcgTG9nZ2VyKHtuYW1lOiBcIkFwaU1ha2VyIC8gV2Vic29ja2V0UmVxdWVzdENsaWVudFwifSlcbmNvbnN0IHNoYXJlZCA9IHt9XG5cbi8qKiBTaGFyZWQgd2Vic29ja2V0IHJlcXVlc3QgY2xpZW50IGZvciBBcGlNYWtlciBjb21tYW5kL3NlcnZpY2UgZXhlY3V0aW9uLiAqL1xuZXhwb3J0IGRlZmF1bHQgY2xhc3MgQXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50IHtcbiAgLyoqIEByZXR1cm5zIHtBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnR9ICovXG4gIHN0YXRpYyBjdXJyZW50ICgpIHtcbiAgICBpZiAoIXNoYXJlZC5jdXJyZW50QXBpTWFrZXJXZWJzb2NrZXRSZXF1ZXN0Q2xpZW50KSB7XG4gICAgICBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudCA9IG5ldyBBcGlNYWtlcldlYnNvY2tldFJlcXVlc3RDbGllbnQoKVxuICAgIH1cblxuICAgIHJldHVybiBzaGFyZWQuY3VycmVudEFwaU1ha2VyV2Vic29ja2V0UmVxdWVzdENsaWVudFxuICB9XG5cbiAgLyoqIENvbnN0cnVjdG9yLiAqL1xuICBjb25zdHJ1Y3RvciAoKSB7XG4gICAgdGhpcy5jdXJyZW50UmVxdWVzdElkID0gMVxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0ge31cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnQgPSB7fVxuICAgIHRoaXMucmVzcG9uc2VDYWNoZSA9IHt9XG4gICAgdGhpcy5zdWJzY3JpcHRpb25TdGF0ZSA9IFwibmV3XCJcbiAgfVxuXG4gIC8qKlxuICAgKiBAcGFyYW0ge29iamVjdH0gYXJnc1xuICAgKiBAcGFyYW0ge2Jvb2xlYW59IFthcmdzLmNhY2hlUmVzcG9uc2VdXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gW2FyZ3MuZ2xvYmFsXVxuICAgKiBAcGFyYW0geyh2YWx1ZTogc3RyaW5nKSA9PiB2b2lkfSBbYXJncy5vbkxvZ11cbiAgICogQHBhcmFtIHsodmFsdWU6IFJlY29yZDxzdHJpbmcsIGFueT4pID0+IHZvaWR9IFthcmdzLm9uUHJvZ3Jlc3NdXG4gICAqIEBwYXJhbSB7KHZhbHVlOiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSA9PiB2b2lkfSBbYXJncy5vblJlY2VpdmVkXVxuICAgKiBAcGFyYW0ge1JlY29yZDxzdHJpbmcsIGFueT59IGFyZ3MucmVxdWVzdFxuICAgKiBAcmV0dXJucyB7UHJvbWlzZTxSZWNvcmQ8c3RyaW5nLCBhbnk+Pn1cbiAgICovXG4gIHBlcmZvcm0gKHtjYWNoZVJlc3BvbnNlLCBnbG9iYWwsIG9uTG9nLCBvblByb2dyZXNzLCBvblJlY2VpdmVkLCByZXF1ZXN0fSkge1xuICAgIGNvbnN0IGZpbmdlcnByaW50ID0gSlNPTi5zdHJpbmdpZnkoe2dsb2JhbCwgcmVxdWVzdH0pXG5cbiAgICBpZiAoY2FjaGVSZXNwb25zZSAmJiB0aGlzLnJlc3BvbnNlQ2FjaGVbZmluZ2VycHJpbnRdKSB7XG4gICAgICByZXR1cm4gUHJvbWlzZS5yZXNvbHZlKHRoaXMucmVzcG9uc2VDYWNoZVtmaW5nZXJwcmludF0pXG4gICAgfVxuXG4gICAgaWYgKHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF0pIHtcbiAgICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0RGF0YSA9IHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF1cbiAgICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbcGVuZGluZ1JlcXVlc3REYXRhLnJlcXVlc3RJZF1cblxuICAgICAgaWYgKG9uTG9nKSBwZW5kaW5nUmVxdWVzdD8ub25Mb2dDYWxsYmFja3MucHVzaChvbkxvZylcbiAgICAgIGlmIChvblByb2dyZXNzKSBwZW5kaW5nUmVxdWVzdD8ub25Qcm9ncmVzc0NhbGxiYWNrcy5wdXNoKG9uUHJvZ3Jlc3MpXG4gICAgICBpZiAob25SZWNlaXZlZCkgcGVuZGluZ1JlcXVlc3Q/Lm9uUmVjZWl2ZWRDYWxsYmFja3MucHVzaChvblJlY2VpdmVkKVxuXG4gICAgICByZXR1cm4gcGVuZGluZ1JlcXVlc3REYXRhLnByb21pc2VcbiAgICB9XG5cbiAgICBjb25zdCBwcm9taXNlID0gbmV3IFByb21pc2UoKHJlc29sdmUsIHJlamVjdCkgPT4ge1xuICAgICAgY29uc3QgcmVxdWVzdElkID0gdGhpcy5jdXJyZW50UmVxdWVzdElkXG4gICAgICB0aGlzLmN1cnJlbnRSZXF1ZXN0SWQgKz0gMVxuXG4gICAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tyZXF1ZXN0SWRdID0ge1xuICAgICAgICBjYWNoZVJlc3BvbnNlLFxuICAgICAgICBmaW5nZXJwcmludCxcbiAgICAgICAgb25Mb2dDYWxsYmFja3M6IG9uTG9nID8gW29uTG9nXSA6IFtdLFxuICAgICAgICBvblByb2dyZXNzQ2FsbGJhY2tzOiBvblByb2dyZXNzID8gW29uUHJvZ3Jlc3NdIDogW10sXG4gICAgICAgIG9uUmVjZWl2ZWRDYWxsYmFja3M6IG9uUmVjZWl2ZWQgPyBbb25SZWNlaXZlZF0gOiBbXSxcbiAgICAgICAgcmVqZWN0LFxuICAgICAgICByZXNvbHZlXG4gICAgICB9XG5cbiAgICAgIHRoaXMud2FpdEZvclN1YnNjcmlwdGlvbigpLnRoZW4oKCkgPT4ge1xuICAgICAgICB0aGlzLmVuc3VyZVN1YnNjcmlwdGlvbigpLnBlcmZvcm0oXCJleGVjdXRlXCIsIHtcbiAgICAgICAgICBjYWNoZV9yZXNwb25zZTogY2FjaGVSZXNwb25zZSxcbiAgICAgICAgICBnbG9iYWwsXG4gICAgICAgICAgcmVxdWVzdCxcbiAgICAgICAgICByZXF1ZXN0X2lkOiByZXF1ZXN0SWRcbiAgICAgICAgfSlcbiAgICAgIH0pXG4gICAgICAgIC5jYXRjaCgoZXJyb3IpID0+IHtcbiAgICAgICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbcmVxdWVzdElkXVxuICAgICAgICAgIHJlamVjdChlcnJvcilcbiAgICAgICAgfSlcbiAgICB9KVxuXG4gICAgdGhpcy5wZW5kaW5nUmVxdWVzdHNCeUZpbmdlcnByaW50W2ZpbmdlcnByaW50XSA9IHtwcm9taXNlLCByZXF1ZXN0SWQ6IHRoaXMuY3VycmVudFJlcXVlc3RJZCAtIDF9XG5cbiAgICBwcm9taXNlLnRoZW4oKCkgPT4ge1xuICAgICAgZGVsZXRlIHRoaXMucGVuZGluZ1JlcXVlc3RzQnlGaW5nZXJwcmludFtmaW5nZXJwcmludF1cbiAgICB9LCAoKSA9PiB7XG4gICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNCeUZpbmdlcnByaW50W2ZpbmdlcnByaW50XVxuICAgIH0pXG5cbiAgICByZXR1cm4gcHJvbWlzZVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHthbnl9ICovXG4gIGVuc3VyZVN1YnNjcmlwdGlvbiAoKSB7XG4gICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvbikge1xuICAgICAgbG9nZ2VyLmRlYnVnKFwiQ3JlYXRpbmcgd2Vic29ja2V0IHJlcXVlc3Qgc3Vic2NyaXB0aW9uXCIpXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJjb25uZWN0aW5nXCJcbiAgICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb25SZWFkeVByb21pc2UoKVxuXG4gICAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IGNoYW5uZWxzQ29uc3VtZXIoKS5zdWJzY3JpcHRpb25zLmNyZWF0ZShcbiAgICAgICAge2NoYW5uZWw6IFwiQXBpTWFrZXI6OlJlcXVlc3RzQ2hhbm5lbFwifSxcbiAgICAgICAge1xuICAgICAgICAgIGNvbm5lY3RlZDogdGhpcy5vbkNvbm5lY3RlZCxcbiAgICAgICAgICBkaXNjb25uZWN0ZWQ6IHRoaXMub25EaXNjb25uZWN0ZWQsXG4gICAgICAgICAgcmVjZWl2ZWQ6IHRoaXMub25SZWNlaXZlZCxcbiAgICAgICAgICByZWplY3RlZDogdGhpcy5vblJlamVjdGVkXG4gICAgICAgIH1cbiAgICAgIClcbiAgICB9XG5cbiAgICByZXR1cm4gdGhpcy5zdWJzY3JpcHRpb25cbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7UHJvbWlzZTx2b2lkPn0gKi9cbiAgd2FpdEZvclN1YnNjcmlwdGlvbiAoKSB7XG4gICAgdGhpcy5lbnN1cmVTdWJzY3JpcHRpb24oKVxuXG4gICAgaWYgKHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPT0gXCJjb25uZWN0ZWRcIikge1xuICAgICAgcmV0dXJuIFByb21pc2UucmVzb2x2ZSgpXG4gICAgfVxuXG4gICAgaWYgKCF0aGlzLnN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSkge1xuICAgICAgdGhpcy5yZXNldFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSgpXG4gICAgfVxuXG4gICAgcmV0dXJuIHRoaXMuc3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlXG4gIH1cblxuICAvKiogQHJldHVybnMge3ZvaWR9ICovXG4gIHJlc2V0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlICgpIHtcbiAgICB0aGlzLnN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlLCByZWplY3QpID0+IHtcbiAgICAgIHRoaXMucmVzb2x2ZVN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZSA9IHJlc29sdmVcbiAgICAgIHRoaXMucmVqZWN0U3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlID0gcmVqZWN0XG4gICAgfSlcbiAgfVxuXG4gIC8qKiBAcmV0dXJucyB7dm9pZH0gKi9cbiAgb25Db25uZWN0ZWQgPSAoKSA9PiB7XG4gICAgbG9nZ2VyLmRlYnVnKFwiV2Vic29ja2V0IHJlcXVlc3Qgc3Vic2NyaXB0aW9uIGNvbm5lY3RlZFwiKVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcImNvbm5lY3RlZFwiXG4gICAgdGhpcy5yZXNvbHZlU3Vic2NyaXB0aW9uUmVhZHlQcm9taXNlPy4oKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvbkRpc2Nvbm5lY3RlZCA9ICgpID0+IHtcbiAgICBsb2dnZXIuZGVidWcoXCJXZWJzb2NrZXQgcmVxdWVzdCBzdWJzY3JpcHRpb24gZGlzY29ubmVjdGVkXCIpXG4gICAgdGhpcy5yZWplY3RQZW5kaW5nUmVxdWVzdHMobmV3IEVycm9yKFwiV2Vic29ja2V0IHJlcXVlc3Qgc3Vic2NyaXB0aW9uIGRpc2Nvbm5lY3RlZFwiKSlcbiAgICB0aGlzLnN1YnNjcmlwdGlvblN0YXRlID0gXCJkaXNjb25uZWN0ZWRcIlxuICAgIHRoaXMuc3Vic2NyaXB0aW9uID0gbnVsbFxuICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb25SZWFkeVByb21pc2UoKVxuICB9XG5cbiAgLyoqIEByZXR1cm5zIHt2b2lkfSAqL1xuICBvblJlamVjdGVkID0gKCkgPT4ge1xuICAgIGNvbnN0IGVycm9yID0gbmV3IEVycm9yKFwiV2Vic29ja2V0IHJlcXVlc3Qgc3Vic2NyaXB0aW9uIHdhcyByZWplY3RlZFwiKVxuXG4gICAgbG9nZ2VyLmVycm9yKGVycm9yKVxuICAgIHRoaXMucmVqZWN0UGVuZGluZ1JlcXVlc3RzKGVycm9yKVxuICAgIHRoaXMuc3Vic2NyaXB0aW9uU3RhdGUgPSBcInJlamVjdGVkXCJcbiAgICB0aGlzLnN1YnNjcmlwdGlvbiA9IG51bGxcbiAgICB0aGlzLnJlamVjdFN1YnNjcmlwdGlvblJlYWR5UHJvbWlzZT8uKGVycm9yKVxuICAgIHRoaXMucmVzZXRTdWJzY3JpcHRpb25SZWFkeVByb21pc2UoKVxuICB9XG5cbiAgLyoqXG4gICAqIEBwYXJhbSB7UmVjb3JkPHN0cmluZywgYW55Pn0gZGF0YVxuICAgKiBAcmV0dXJucyB7dm9pZH1cbiAgICovXG4gIG9uUmVjZWl2ZWQgPSAoZGF0YSkgPT4ge1xuICAgIGNvbnN0IHBlbmRpbmdSZXF1ZXN0ID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNbZGF0YS5yZXF1ZXN0X2lkXVxuXG4gICAgaWYgKCFwZW5kaW5nUmVxdWVzdCkge1xuICAgICAgbG9nZ2VyLmRlYnVnKCgpID0+IFtcIklnbm9yaW5nIHdlYnNvY2tldCByZXNwb25zZSB3aXRob3V0IGEgcGVuZGluZyByZXF1ZXN0XCIsIHtkYXRhfV0pXG4gICAgICByZXR1cm5cbiAgICB9XG5cbiAgICBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX2NvbW1hbmRfbG9nXCIpIHtcbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uTG9nQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhkYXRhLm1lc3NhZ2UpKVxuICAgIH0gZWxzZSBpZiAoZGF0YS50eXBlID09IFwiYXBpX21ha2VyX2NvbW1hbmRfcHJvZ3Jlc3NcIikge1xuICAgICAgY29uc3QgcHJvZ3Jlc3NEYXRhID0ge1xuICAgICAgICBjb3VudDogZGF0YS5jb3VudCxcbiAgICAgICAgcHJvZ3Jlc3M6IGRhdGEucHJvZ3Jlc3MsXG4gICAgICAgIHRvdGFsOiBkYXRhLnRvdGFsXG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdSZXF1ZXN0Lm9uUHJvZ3Jlc3NDYWxsYmFja3MuZm9yRWFjaCgoY2FsbGJhY2spID0+IGNhbGxiYWNrKHByb2dyZXNzRGF0YSkpXG4gICAgfSBlbHNlIGlmIChkYXRhLnR5cGUgPT0gXCJhcGlfbWFrZXJfcmVxdWVzdF9yZWNlaXZlZFwiKSB7XG4gICAgICBwZW5kaW5nUmVxdWVzdC5vblJlY2VpdmVkQ2FsbGJhY2tzLmZvckVhY2goKGNhbGxiYWNrKSA9PiBjYWxsYmFjayhkYXRhKSlcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImFwaV9tYWtlcl9yZXF1ZXN0X3Jlc3BvbnNlXCIpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG5cbiAgICAgIGlmIChwZW5kaW5nUmVxdWVzdC5jYWNoZVJlc3BvbnNlKSB7XG4gICAgICAgIHRoaXMucmVzcG9uc2VDYWNoZVtwZW5kaW5nUmVxdWVzdC5maW5nZXJwcmludF0gPSBkYXRhLnJlc3BvbnNlXG4gICAgICB9XG5cbiAgICAgIHBlbmRpbmdSZXF1ZXN0LnJlc29sdmUoZGF0YS5yZXNwb25zZSlcbiAgICB9IGVsc2UgaWYgKGRhdGEudHlwZSA9PSBcImFwaV9tYWtlcl9yZXF1ZXN0X2Vycm9yXCIpIHtcbiAgICAgIGRlbGV0ZSB0aGlzLnBlbmRpbmdSZXF1ZXN0c1tkYXRhLnJlcXVlc3RfaWRdXG4gICAgICBwZW5kaW5nUmVxdWVzdC5yZWplY3QobmV3IEN1c3RvbUVycm9yKFwiV2Vic29ja2V0IHJlcXVlc3QgZmFpbGVkXCIsIHtyZXNwb25zZTogZGF0YS5yZXNwb25zZX0pKVxuICAgIH0gZWxzZSB7XG4gICAgICBkZWxldGUgdGhpcy5wZW5kaW5nUmVxdWVzdHNbZGF0YS5yZXF1ZXN0X2lkXVxuICAgICAgcGVuZGluZ1JlcXVlc3QucmVqZWN0KG5ldyBFcnJvcihgVW5rbm93biB3ZWJzb2NrZXQgcmVxdWVzdCByZXNwb25zZSB0eXBlOiAke2RhdGEudHlwZX1gKSlcbiAgICB9XG4gIH1cblxuICAvKipcbiAgICogQHBhcmFtIHtFcnJvcn0gZXJyb3JcbiAgICogQHJldHVybnMge3ZvaWR9XG4gICAqL1xuICByZWplY3RQZW5kaW5nUmVxdWVzdHMgKGVycm9yKSB7XG4gICAgY29uc3QgcGVuZGluZ1JlcXVlc3RzID0gdGhpcy5wZW5kaW5nUmVxdWVzdHNcblxuICAgIHRoaXMucGVuZGluZ1JlcXVlc3RzID0ge31cbiAgICB0aGlzLnBlbmRpbmdSZXF1ZXN0c0J5RmluZ2VycHJpbnQgPSB7fVxuXG4gICAgT2JqZWN0LnZhbHVlcyhwZW5kaW5nUmVxdWVzdHMpLmZvckVhY2goKHBlbmRpbmdSZXF1ZXN0KSA9PiB7XG4gICAgICBxdWV1ZU1pY3JvdGFzaygoKSA9PiBwZW5kaW5nUmVxdWVzdC5yZWplY3QoZXJyb3IpKVxuICAgIH0pXG4gIH1cbn1cbiJdfQ==
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@kaspernj/api-maker",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "1.0.
|
|
4
|
+
"version": "1.0.2123",
|
|
5
5
|
"description": "My new module",
|
|
6
6
|
"files": [
|
|
7
7
|
"build/**"
|
|
@@ -41,6 +41,7 @@
|
|
|
41
41
|
"license": "MIT",
|
|
42
42
|
"homepage": "https://github.com/kaspernj/api_maker#readme",
|
|
43
43
|
"dependencies": {
|
|
44
|
+
"classnames": "^2.5.1",
|
|
44
45
|
"clone-deep": ">= 4.0.1",
|
|
45
46
|
"debounce": ">= 2.0.0",
|
|
46
47
|
"diggerize": ">= 1.0.10",
|
|
@@ -57,6 +58,7 @@
|
|
|
57
58
|
"numberable": ">= 1.0.0",
|
|
58
59
|
"object-to-formdata": ">= 4.1.0",
|
|
59
60
|
"on-location-changed": ">= 1.0.18",
|
|
61
|
+
"prop-types-exact": "^1.2.7",
|
|
60
62
|
"qs": ">= 6.9.3",
|
|
61
63
|
"replaceall": ">= 0.1.6",
|
|
62
64
|
"responsive-breakpoints": ">= 0.1.3",
|
|
@@ -71,22 +73,26 @@
|
|
|
71
73
|
"ya-use-event-listener": ">= 0.1.1"
|
|
72
74
|
},
|
|
73
75
|
"devDependencies": {
|
|
74
|
-
"@
|
|
76
|
+
"@eslint/compat": "^2.0.3",
|
|
75
77
|
"@babel/preset-env": "^7.12.11",
|
|
76
78
|
"@babel/preset-react": "^7.26.3",
|
|
77
79
|
"@jest/globals": "~30.3.0",
|
|
78
80
|
"@types/react": "~19.0.10",
|
|
79
81
|
"babel-jest": "~30.3.0",
|
|
80
|
-
"eslint": "^
|
|
82
|
+
"eslint": "^10.0.3",
|
|
81
83
|
"eslint-config-expo": "~9.2.0",
|
|
82
|
-
"eslint-plugin-jest": "^29.0
|
|
83
|
-
"eslint-plugin-jsdoc": "^62.
|
|
84
|
+
"eslint-plugin-jest": "^29.15.0",
|
|
85
|
+
"eslint-plugin-jsdoc": "^62.8.0",
|
|
84
86
|
"eslint-plugin-react": "^7.23.2",
|
|
85
87
|
"expo": "~53.0.27",
|
|
86
88
|
"expo-module-scripts": "^55.0.2",
|
|
89
|
+
"flash-notifications": "^0.0.42",
|
|
90
|
+
"history": "^5.3.0",
|
|
91
|
+
"i18n-on-steroids": "^1.0.21",
|
|
87
92
|
"jest": "~29.7.0",
|
|
88
93
|
"react": "19.0.0",
|
|
89
94
|
"react-native": "0.79.6",
|
|
95
|
+
"react-native-vector-icons": "^10.3.0",
|
|
90
96
|
"typescript": "~5.8.3",
|
|
91
97
|
"velocious": "^1.0.175"
|
|
92
98
|
},
|
|
@@ -107,8 +113,12 @@
|
|
|
107
113
|
"metro-resolver": "^0.82.0"
|
|
108
114
|
},
|
|
109
115
|
"overrides": {
|
|
116
|
+
"@typescript-eslint/eslint-plugin": "^8.57.1",
|
|
117
|
+
"@typescript-eslint/parser": "^8.57.1",
|
|
118
|
+
"@typescript-eslint/utils": "^8.57.1",
|
|
110
119
|
"@expo/config-plugins": "~10.1.1",
|
|
111
120
|
"@expo/metro-config": "~0.20.18",
|
|
121
|
+
"eslint-plugin-expo": "^1.0.0",
|
|
112
122
|
"metro": "^0.82.0",
|
|
113
123
|
"metro-config": "^0.82.0",
|
|
114
124
|
"metro-resolver": "^0.82.0"
|