@rei-standard/amsg-server 2.6.0-next.22 → 2.6.0-next.23
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 +1 -1
- package/dist/{chunk-5J73MSQ5.mjs → chunk-3JEWYDM4.mjs} +1 -1
- package/dist/{chunk-ILH32T3G.cjs → chunk-BNZLICCI.cjs} +1 -1
- package/dist/cloudflare.cjs +2 -2
- package/dist/cloudflare.mjs +1 -1
- package/dist/index.cjs +25 -25
- package/dist/index.mjs +1 -1
- package/package.json +2 -2
package/README.md
CHANGED
|
@@ -194,7 +194,7 @@ const message = body.length <= remainingBytes ? body : body.slice(0, remainingBy
|
|
|
194
194
|
|
|
195
195
|
为什么这么分:订阅是按 `userVisibleOnly: true` 建的,每条 push 都欠用户一次可见反馈。`reasoning` / `tool_request` / `error` 在 Service Worker 那边是静默送给页面的,推过去不会有任何可见反馈,却要跟浏览器赊一次账——Firefox 对这类 push 有配额、超了退掉订阅,iOS 给新订阅几天宽限期、过后一条就吊销订阅,而且掉订阅是静默发生的,服务端只看得到后续推送返回 410。而这些内容在收件箱里一个字不少,客户端上线补拉就行(完整取舍见 `@rei-standard/amsg-sw` README 的「不展示通知的代价」一节)。
|
|
196
196
|
|
|
197
|
-
**想让某一条照样弹**,给它带上 `notification: { show: 'always' }`——判定读的是与 Service Worker 同一份规则(`@rei-standard/amsg-shared` 的 `notificationIntent`),宿主说了要弹,发送端就当它值得占用推送通道。逐条控制,不需要在服务端配开关。嫌打扰就配 `tag` 折叠加 `silent:
|
|
197
|
+
**想让某一条照样弹**,给它带上 `notification: { show: 'always' }`——判定读的是与 Service Worker 同一份规则(`@rei-standard/amsg-shared` 的 `notificationIntent`),宿主说了要弹,发送端就当它值得占用推送通道。逐条控制,不需要在服务端配开关。嫌打扰就配 `tag` 折叠加 `silent`,而不是不弹——只在用户看着页面时想安静的写 `silent: 'when-visible'`,静不静音由 Service Worker 收到时现算(发送端定不了这件事,它不知道用户此刻在不在前台)。`show: 'when-hidden'` 也照推(它到底弹不弹只有 Service Worker 当场知道),但那是给老部署留的兼容档,新代码在「一定弹」和「压根不推」里挑一个。
|
|
198
198
|
|
|
199
199
|
跳过推送的那条不标 `delivered_at`,行留在收件箱里等客户端补收;这正是能跳过的前提。
|
|
200
200
|
|
|
@@ -5213,7 +5213,7 @@ function createClientStateHandler(ctx) {
|
|
|
5213
5213
|
}
|
|
5214
5214
|
|
|
5215
5215
|
// src/server/lib/version.js
|
|
5216
|
-
var SERVER_VERSION = true ? "2.6.0-next.
|
|
5216
|
+
var SERVER_VERSION = true ? "2.6.0-next.23" : "0.0.0-dev";
|
|
5217
5217
|
|
|
5218
5218
|
// src/server/handlers/capabilities.js
|
|
5219
5219
|
var SERVER_FEATURES = Object.freeze([
|
|
@@ -5213,7 +5213,7 @@ function createClientStateHandler(ctx) {
|
|
|
5213
5213
|
}
|
|
5214
5214
|
|
|
5215
5215
|
// src/server/lib/version.js
|
|
5216
|
-
var SERVER_VERSION = true ? "2.6.0-next.
|
|
5216
|
+
var SERVER_VERSION = true ? "2.6.0-next.23" : "0.0.0-dev";
|
|
5217
5217
|
|
|
5218
5218
|
// src/server/handlers/capabilities.js
|
|
5219
5219
|
var SERVER_FEATURES = Object.freeze([
|
package/dist/cloudflare.cjs
CHANGED
|
@@ -26,7 +26,7 @@
|
|
|
26
26
|
|
|
27
27
|
|
|
28
28
|
|
|
29
|
-
var
|
|
29
|
+
var _chunkBNZLICCIcjs = require('./chunk-BNZLICCI.cjs');
|
|
30
30
|
require('./chunk-7NMQFTDJ.cjs');
|
|
31
31
|
|
|
32
32
|
|
|
@@ -56,4 +56,4 @@ require('./chunk-7NMQFTDJ.cjs');
|
|
|
56
56
|
|
|
57
57
|
|
|
58
58
|
|
|
59
|
-
exports.DEFAULT_MAX_REQUEST_BODY_BYTES =
|
|
59
|
+
exports.DEFAULT_MAX_REQUEST_BODY_BYTES = _chunkBNZLICCIcjs.DEFAULT_MAX_REQUEST_BODY_BYTES; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkBNZLICCIcjs.MAX_PUSH_PAYLOAD_BYTES; exports.NonRetryableError = _chunkBNZLICCIcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkBNZLICCIcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkBNZLICCIcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkBNZLICCIcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkBNZLICCIcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkBNZLICCIcjs.advanceOccurrence; exports.createD1Adapter = _chunkBNZLICCIcjs.createD1Adapter; exports.createSingleUserCloudflareWorker = _chunkBNZLICCIcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkBNZLICCIcjs.createSingleUserServer; exports.createWebCryptoWebPush = _chunkBNZLICCIcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkBNZLICCIcjs.decryptFromStorage; exports.decryptPayload = _chunkBNZLICCIcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkBNZLICCIcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkBNZLICCIcjs.encryptForStorage; exports.ensureSchema = _chunkBNZLICCIcjs.ensureSchema; exports.getSchemaVersion = _chunkBNZLICCIcjs.getSchemaVersion; exports.isNonRetryableError = _chunkBNZLICCIcjs.isNonRetryableError; exports.isValidTimeZoneId = _chunkBNZLICCIcjs.isValidTimeZoneId; exports.measurePushPayload = _chunkBNZLICCIcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkBNZLICCIcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkBNZLICCIcjs.planNextOccurrence; exports.readRequestBody = _chunkBNZLICCIcjs.readRequestBody; exports.runScheduledTick = _chunkBNZLICCIcjs.runScheduledTick; exports.runTask = _chunkBNZLICCIcjs.runTask; exports.summarizeErrorCause = _chunkBNZLICCIcjs.summarizeErrorCause;
|
package/dist/cloudflare.mjs
CHANGED
package/dist/index.cjs
CHANGED
|
@@ -71,7 +71,7 @@
|
|
|
71
71
|
|
|
72
72
|
|
|
73
73
|
|
|
74
|
-
var
|
|
74
|
+
var _chunkBNZLICCIcjs = require('./chunk-BNZLICCI.cjs');
|
|
75
75
|
require('./chunk-7NMQFTDJ.cjs');
|
|
76
76
|
|
|
77
77
|
// src/server/adapters/factory.js
|
|
@@ -105,7 +105,7 @@ async function createAdapter(config) {
|
|
|
105
105
|
// src/server/handlers/init-tenant.js
|
|
106
106
|
function createInitTenantHandler(ctx) {
|
|
107
107
|
async function POST(headers, body) {
|
|
108
|
-
const initSecret =
|
|
108
|
+
const initSecret = _chunkBNZLICCIcjs.getHeader.call(void 0, headers, "x-init-secret");
|
|
109
109
|
if (ctx.tenant.initSecret && initSecret !== ctx.tenant.initSecret) {
|
|
110
110
|
return {
|
|
111
111
|
status: 401,
|
|
@@ -118,7 +118,7 @@ function createInitTenantHandler(ctx) {
|
|
|
118
118
|
}
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
|
-
const parsed =
|
|
121
|
+
const parsed = _chunkBNZLICCIcjs.parseJsonBody.call(void 0, body);
|
|
122
122
|
if (!parsed.ok) {
|
|
123
123
|
return {
|
|
124
124
|
status: 400,
|
|
@@ -132,7 +132,7 @@ function createInitTenantHandler(ctx) {
|
|
|
132
132
|
const tenantId = payload.tenantId || void 0;
|
|
133
133
|
const driver = payload.driver;
|
|
134
134
|
const databaseUrl = payload.databaseUrl || payload.connectionString;
|
|
135
|
-
if (tenantId && !
|
|
135
|
+
if (tenantId && !_chunkBNZLICCIcjs.isValidUUIDv4.call(void 0, tenantId)) {
|
|
136
136
|
return {
|
|
137
137
|
status: 400,
|
|
138
138
|
body: {
|
|
@@ -252,7 +252,7 @@ function createSendNotificationsHandler(ctx) {
|
|
|
252
252
|
}
|
|
253
253
|
};
|
|
254
254
|
}
|
|
255
|
-
const data = await
|
|
255
|
+
const data = await _chunkBNZLICCIcjs.runScheduledTick.call(void 0, { ...ctx, db, masterKey });
|
|
256
256
|
return { status: 200, body: { success: true, data } };
|
|
257
257
|
}
|
|
258
258
|
return { POST };
|
|
@@ -274,16 +274,16 @@ function encryptConfig(config, kekBuffer) {
|
|
|
274
274
|
const plaintext = Buffer.from(JSON.stringify(config), "utf8");
|
|
275
275
|
const ciphertext = Buffer.concat([cipher.update(plaintext), cipher.final()]);
|
|
276
276
|
const authTag = cipher.getAuthTag();
|
|
277
|
-
return `v1.${
|
|
277
|
+
return `v1.${_chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, iv)}.${_chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, authTag)}.${_chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, ciphertext)}`;
|
|
278
278
|
}
|
|
279
279
|
function decryptConfig(encrypted, kekBuffer) {
|
|
280
280
|
const parts = String(encrypted || "").split(".");
|
|
281
281
|
if (parts.length !== 4 || parts[0] !== "v1") {
|
|
282
282
|
throw new Error("INVALID_TENANT_CONFIG");
|
|
283
283
|
}
|
|
284
|
-
const iv =
|
|
285
|
-
const authTag =
|
|
286
|
-
const ciphertext =
|
|
284
|
+
const iv = _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, parts[1]);
|
|
285
|
+
const authTag = _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, parts[2]);
|
|
286
|
+
const ciphertext = _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, parts[3]);
|
|
287
287
|
const decipher = _crypto.createDecipheriv.call(void 0, "aes-256-gcm", kekBuffer, iv);
|
|
288
288
|
decipher.setAuthTag(authTag);
|
|
289
289
|
const plaintext = Buffer.concat([decipher.update(ciphertext), decipher.final()]).toString("utf8");
|
|
@@ -351,7 +351,7 @@ function createTenantBlobStore(options) {
|
|
|
351
351
|
// src/server/tenant/token.js
|
|
352
352
|
|
|
353
353
|
function sign(input, secret) {
|
|
354
|
-
return
|
|
354
|
+
return _chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, _crypto.createHmac.call(void 0, "sha256", secret).update(input).digest());
|
|
355
355
|
}
|
|
356
356
|
function nowEpochSeconds() {
|
|
357
357
|
return Math.floor(Date.now() / 1e3);
|
|
@@ -367,8 +367,8 @@ function createTenantToken(params, secret) {
|
|
|
367
367
|
v: 1
|
|
368
368
|
};
|
|
369
369
|
const header = { alg: "HS256", typ: "JWT" };
|
|
370
|
-
const encodedHeader =
|
|
371
|
-
const encodedPayload =
|
|
370
|
+
const encodedHeader = _chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, _chunkBNZLICCIcjs.utf8.call(void 0, JSON.stringify(header)));
|
|
371
|
+
const encodedPayload = _chunkBNZLICCIcjs.bytesToBase64Url.call(void 0, _chunkBNZLICCIcjs.utf8.call(void 0, JSON.stringify(payload)));
|
|
372
372
|
const signingInput = `${encodedHeader}.${encodedPayload}`;
|
|
373
373
|
const signature = sign(signingInput, secret);
|
|
374
374
|
return `${signingInput}.${signature}`;
|
|
@@ -387,17 +387,17 @@ function verifyTenantToken(token, secret, options = {}) {
|
|
|
387
387
|
let receivedBytes;
|
|
388
388
|
let expectedBytes;
|
|
389
389
|
try {
|
|
390
|
-
receivedBytes =
|
|
391
|
-
expectedBytes =
|
|
390
|
+
receivedBytes = _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, receivedSignature);
|
|
391
|
+
expectedBytes = _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, expectedSignature);
|
|
392
392
|
} catch (e) {
|
|
393
393
|
throw new Error("INVALID_TENANT_AUTH");
|
|
394
394
|
}
|
|
395
|
-
if (!
|
|
395
|
+
if (!_chunkBNZLICCIcjs.timingSafeEqualBytes.call(void 0, receivedBytes, expectedBytes)) {
|
|
396
396
|
throw new Error("INVALID_TENANT_AUTH");
|
|
397
397
|
}
|
|
398
398
|
let payload;
|
|
399
399
|
try {
|
|
400
|
-
payload = JSON.parse(
|
|
400
|
+
payload = JSON.parse(_chunkBNZLICCIcjs.utf8Decode.call(void 0, _chunkBNZLICCIcjs.base64UrlToBytes.call(void 0, encodedPayload)));
|
|
401
401
|
} catch (e2) {
|
|
402
402
|
throw new Error("INVALID_TENANT_AUTH");
|
|
403
403
|
}
|
|
@@ -621,15 +621,15 @@ async function createReiServer(config) {
|
|
|
621
621
|
return {
|
|
622
622
|
handlers: {
|
|
623
623
|
initTenant: createInitTenantHandler(ctx),
|
|
624
|
-
getUserKey:
|
|
625
|
-
scheduleMessage:
|
|
624
|
+
getUserKey: _chunkBNZLICCIcjs.createGetUserKeyHandler.call(void 0, ctx),
|
|
625
|
+
scheduleMessage: _chunkBNZLICCIcjs.createScheduleMessageHandler.call(void 0, ctx),
|
|
626
626
|
sendNotifications: createSendNotificationsHandler(ctx),
|
|
627
|
-
updateMessage:
|
|
628
|
-
cancelMessage:
|
|
629
|
-
messages:
|
|
630
|
-
getMessage:
|
|
631
|
-
pushSubscription:
|
|
632
|
-
llmCredentials:
|
|
627
|
+
updateMessage: _chunkBNZLICCIcjs.createUpdateMessageHandler.call(void 0, ctx),
|
|
628
|
+
cancelMessage: _chunkBNZLICCIcjs.createCancelMessageHandler.call(void 0, ctx),
|
|
629
|
+
messages: _chunkBNZLICCIcjs.createMessagesHandler.call(void 0, ctx),
|
|
630
|
+
getMessage: _chunkBNZLICCIcjs.createGetMessageHandler.call(void 0, ctx),
|
|
631
|
+
pushSubscription: _chunkBNZLICCIcjs.createPushSubscriptionHandler.call(void 0, ctx),
|
|
632
|
+
llmCredentials: _chunkBNZLICCIcjs.createLlmCredentialsHandler.call(void 0, ctx)
|
|
633
633
|
}
|
|
634
634
|
};
|
|
635
635
|
}
|
|
@@ -695,4 +695,4 @@ async function createReiServer(config) {
|
|
|
695
695
|
|
|
696
696
|
|
|
697
697
|
|
|
698
|
-
exports.CORS_ALLOW_HEADERS =
|
|
698
|
+
exports.CORS_ALLOW_HEADERS = _chunkBNZLICCIcjs.CORS_ALLOW_HEADERS; exports.CORS_ALLOW_METHODS = _chunkBNZLICCIcjs.CORS_ALLOW_METHODS; exports.CRED_ID_MAX_LENGTH = _chunkBNZLICCIcjs.CRED_ID_MAX_LENGTH; exports.CRED_PUT_BATCH_MAX = _chunkBNZLICCIcjs.CRED_PUT_BATCH_MAX; exports.CRED_REFS_MAX_ENTRIES = _chunkBNZLICCIcjs.CRED_REFS_MAX_ENTRIES; exports.CRED_ROWS_PER_USER_MAX = _chunkBNZLICCIcjs.CRED_ROWS_PER_USER_MAX; exports.DEFAULT_CLAIM_LEASE_MS = _chunkBNZLICCIcjs.DEFAULT_CLAIM_LEASE_MS; exports.DEFAULT_HEARTBEAT_LEASE_TTL_MS = _chunkBNZLICCIcjs.DEFAULT_HEARTBEAT_LEASE_TTL_MS; exports.DEFAULT_LEASE_HEARTBEAT_MS = _chunkBNZLICCIcjs.DEFAULT_LEASE_HEARTBEAT_MS; exports.DEFAULT_MAX_REQUEST_BODY_BYTES = _chunkBNZLICCIcjs.DEFAULT_MAX_REQUEST_BODY_BYTES; exports.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE = _chunkBNZLICCIcjs.DEFAULT_MAX_SCHEDULED_TASKS_PER_FIRE; exports.DEFAULT_MAX_TOOL_ITERATIONS = _chunkBNZLICCIcjs.DEFAULT_MAX_TOOL_ITERATIONS; exports.DEFAULT_TOTAL_TIMEOUT_MS = _chunkBNZLICCIcjs.DEFAULT_TOTAL_TIMEOUT_MS; exports.DeploymentConfigError = _chunkBNZLICCIcjs.DeploymentConfigError; exports.MAX_PUSH_PAYLOAD_BYTES = _chunkBNZLICCIcjs.MAX_PUSH_PAYLOAD_BYTES; exports.MAX_TASK_PAYLOAD_BYTES = _chunkBNZLICCIcjs.MAX_TASK_PAYLOAD_BYTES; exports.MIN_SCHEDULE_LEAD_MS = _chunkBNZLICCIcjs.MIN_SCHEDULE_LEAD_MS; exports.NonRetryableError = _chunkBNZLICCIcjs.NonRetryableError; exports.PUSH_ENVELOPE_RESERVED_BYTES = _chunkBNZLICCIcjs.PUSH_ENVELOPE_RESERVED_BYTES; exports.SCHEMA_VERSION = _chunkBNZLICCIcjs.SCHEMA_VERSION; exports.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES = _chunkBNZLICCIcjs.WEB_PUSH_ENCRYPTION_OVERHEAD_BYTES; exports.WEB_PUSH_MAX_BODY_BYTES = _chunkBNZLICCIcjs.WEB_PUSH_MAX_BODY_BYTES; exports.advanceOccurrence = _chunkBNZLICCIcjs.advanceOccurrence; exports.createAdapter = createAdapter; exports.createD1Adapter = _chunkBNZLICCIcjs.createD1Adapter; exports.createReiServer = createReiServer; exports.createSingleUserCloudflareWorker = _chunkBNZLICCIcjs.createSingleUserCloudflareWorker; exports.createSingleUserServer = _chunkBNZLICCIcjs.createSingleUserServer; exports.createTenantToken = createTenantToken; exports.createWebCryptoWebPush = _chunkBNZLICCIcjs.createWebCryptoWebPush; exports.decryptFromStorage = _chunkBNZLICCIcjs.decryptFromStorage; exports.decryptPayload = _chunkBNZLICCIcjs.decryptPayload; exports.deriveUserEncryptionKey = _chunkBNZLICCIcjs.deriveUserEncryptionKey; exports.encryptForStorage = _chunkBNZLICCIcjs.encryptForStorage; exports.ensureSchema = _chunkBNZLICCIcjs.ensureSchema; exports.getSchemaVersion = _chunkBNZLICCIcjs.getSchemaVersion; exports.hasChatCredRef = _chunkBNZLICCIcjs.hasChatCredRef; exports.isNonRetryableError = _chunkBNZLICCIcjs.isNonRetryableError; exports.isValidCredId = _chunkBNZLICCIcjs.isValidCredId; exports.isValidISO8601 = _chunkBNZLICCIcjs.isValidISO8601; exports.isValidTimeZoneId = _chunkBNZLICCIcjs.isValidTimeZoneId; exports.isValidUUID = _chunkBNZLICCIcjs.isValidUUID; exports.isValidUUIDv4 = _chunkBNZLICCIcjs.isValidUUIDv4; exports.isValidUrl = _chunkBNZLICCIcjs.isValidUrl; exports.measurePushPayload = _chunkBNZLICCIcjs.measurePushPayload; exports.nextFutureOccurrence = _chunkBNZLICCIcjs.nextFutureOccurrence; exports.planNextOccurrence = _chunkBNZLICCIcjs.planNextOccurrence; exports.readRequestBody = _chunkBNZLICCIcjs.readRequestBody; exports.resolveLlmCredential = _chunkBNZLICCIcjs.resolveLlmCredential; exports.runScheduledTick = _chunkBNZLICCIcjs.runScheduledTick; exports.runTask = _chunkBNZLICCIcjs.runTask; exports.sanitizeErrorSummary = _chunkBNZLICCIcjs.sanitizeErrorSummary; exports.summarizeErrorCause = _chunkBNZLICCIcjs.summarizeErrorCause; exports.supportsLlmCredentialsStore = _chunkBNZLICCIcjs.supportsLlmCredentialsStore; exports.validateAvatarUrl = _chunkBNZLICCIcjs.validateAvatarUrl; exports.validateCredRefs = _chunkBNZLICCIcjs.validateCredRefs; exports.validateCredValue = _chunkBNZLICCIcjs.validateCredValue; exports.validateLlmMessagesArray = _chunkBNZLICCIcjs.validateLlmMessagesArray; exports.validateScheduleMessagePayload = _chunkBNZLICCIcjs.validateScheduleMessagePayload; exports.validateSplitPattern = _chunkBNZLICCIcjs.validateSplitPattern; exports.verifyTenantToken = verifyTenantToken;
|
package/dist/index.mjs
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@rei-standard/amsg-server",
|
|
3
|
-
"version": "2.6.0-next.
|
|
3
|
+
"version": "2.6.0-next.23",
|
|
4
4
|
"description": "ReiStandard Active Messaging server SDK with pluggable database adapters. Three-axis push schema (messageKind / messageType / messageSubtype) from @rei-standard/amsg-shared. Auto-emits ReasoningPush when the LLM response carries reasoning_content.",
|
|
5
5
|
"repository": {
|
|
6
6
|
"type": "git",
|
|
@@ -39,7 +39,7 @@
|
|
|
39
39
|
},
|
|
40
40
|
"dependencies": {
|
|
41
41
|
"@netlify/blobs": "^8.1.0",
|
|
42
|
-
"@rei-standard/amsg-shared": "^0.4.0-next.
|
|
42
|
+
"@rei-standard/amsg-shared": "^0.4.0-next.8",
|
|
43
43
|
"web-push": "^3.6.7"
|
|
44
44
|
},
|
|
45
45
|
"peerDependencies": {
|