nuabase 2.2.0 → 2.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/dist/cjs/index.cjs +36 -22
- package/dist/esm/index.mjs +36 -21
- package/dist/types/backend/types.d.ts +2 -0
- package/dist/types/lib/auth.d.ts +1 -0
- package/dist/types/nua.d.ts +2 -0
- package/package.json +1 -1
package/dist/cjs/index.cjs
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
|
-
var node_module = require('node:module');
|
|
4
3
|
var require$$0 = require('ajv');
|
|
5
4
|
var require$$1 = require('ajv/dist/2019');
|
|
6
5
|
var require$$2 = require('ajv/dist/2020');
|
|
@@ -8,16 +7,12 @@ var require$$3 = require('ajv/dist/refs/json-schema-draft-07.json');
|
|
|
8
7
|
var require$$4 = require('ajv/dist/refs/json-schema-draft-06.json');
|
|
9
8
|
var zod = require('zod');
|
|
10
9
|
|
|
11
|
-
var _documentCurrentScript = typeof document !== 'undefined' ? document.currentScript : null;
|
|
12
10
|
var dist = {};
|
|
13
11
|
|
|
14
12
|
var nuaLlmClient = {};
|
|
15
13
|
|
|
16
14
|
var logger = {};
|
|
17
15
|
|
|
18
|
-
const require$1 = node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
|
|
19
|
-
function __require() { return require$1("node:crypto"); }
|
|
20
|
-
|
|
21
16
|
var hasRequiredLogger;
|
|
22
17
|
function requireLogger() {
|
|
23
18
|
if (hasRequiredLogger) return logger;
|
|
@@ -27,7 +22,6 @@ function requireLogger() {
|
|
|
27
22
|
logger.truncateText = truncateText;
|
|
28
23
|
logger.pickHeaders = pickHeaders;
|
|
29
24
|
logger.normalizeError = normalizeError;
|
|
30
|
-
const node_crypto_1 = __require();
|
|
31
25
|
class ConsoleLogger {
|
|
32
26
|
debug(message, context) {
|
|
33
27
|
console.debug(`[DEBUG] ${message}`, context || "");
|
|
@@ -43,7 +37,7 @@ function requireLogger() {
|
|
|
43
37
|
}
|
|
44
38
|
}
|
|
45
39
|
logger.ConsoleLogger = ConsoleLogger;
|
|
46
|
-
const generateSpanId = () =>
|
|
40
|
+
const generateSpanId = () => crypto.randomUUID();
|
|
47
41
|
logger.generateSpanId = generateSpanId;
|
|
48
42
|
function truncateText(text, limit = 500) {
|
|
49
43
|
const length = text.length;
|
|
@@ -1216,9 +1210,10 @@ class DirectBackend {
|
|
|
1216
1210
|
this.client = new distExports.NuaLlmClient({ providers: config.providers });
|
|
1217
1211
|
}
|
|
1218
1212
|
async castValue(params) {
|
|
1213
|
+
const model = params.model ?? this.model;
|
|
1219
1214
|
const startTime = Date.now();
|
|
1220
1215
|
const result = await this.client.castValue({
|
|
1221
|
-
model
|
|
1216
|
+
model,
|
|
1222
1217
|
input: { prompt: params.prompt, data: params.data },
|
|
1223
1218
|
output: { name: params.outputName, effectiveSchema: params.outputSchema }
|
|
1224
1219
|
});
|
|
@@ -1235,20 +1230,21 @@ class DirectBackend {
|
|
|
1235
1230
|
success: true,
|
|
1236
1231
|
data: result.data,
|
|
1237
1232
|
usage: result.usage || normalizedUsageZero,
|
|
1238
|
-
model
|
|
1233
|
+
model,
|
|
1239
1234
|
latencyMs,
|
|
1240
1235
|
source: "direct",
|
|
1241
1236
|
meta: {}
|
|
1242
1237
|
};
|
|
1243
1238
|
}
|
|
1244
1239
|
async castArray(params) {
|
|
1240
|
+
const model = params.model ?? this.model;
|
|
1245
1241
|
const startTime = Date.now();
|
|
1246
1242
|
const wrappedSchema = distExports.wrapArraySchema(params.outputSchema, {
|
|
1247
1243
|
primaryKey: params.primaryKey,
|
|
1248
1244
|
outputName: params.outputName
|
|
1249
1245
|
});
|
|
1250
1246
|
const result = await this.client.castArray({
|
|
1251
|
-
model
|
|
1247
|
+
model,
|
|
1252
1248
|
data: params.data,
|
|
1253
1249
|
input: { prompt: params.prompt, primaryKey: params.primaryKey },
|
|
1254
1250
|
output: { name: params.outputName, effectiveSchema: wrappedSchema }
|
|
@@ -1266,7 +1262,7 @@ class DirectBackend {
|
|
|
1266
1262
|
success: true,
|
|
1267
1263
|
data: result.data,
|
|
1268
1264
|
usage: result.usage || normalizedUsageZero,
|
|
1269
|
-
model
|
|
1265
|
+
model,
|
|
1270
1266
|
latencyMs,
|
|
1271
1267
|
source: "direct",
|
|
1272
1268
|
meta: {}
|
|
@@ -1285,6 +1281,13 @@ function resolveConfigValue(config, key, envVar) {
|
|
|
1285
1281
|
}
|
|
1286
1282
|
|
|
1287
1283
|
const isBrowserEnvironment = () => typeof window !== "undefined" && !!window.document;
|
|
1284
|
+
const isLocalhost = () => {
|
|
1285
|
+
if (typeof window === "undefined" || !window.location) {
|
|
1286
|
+
return false;
|
|
1287
|
+
}
|
|
1288
|
+
const host = window.location.hostname;
|
|
1289
|
+
return host === "localhost" || host === "127.0.0.1";
|
|
1290
|
+
};
|
|
1288
1291
|
class AuthTokenManager {
|
|
1289
1292
|
constructor(config) {
|
|
1290
1293
|
this.apiKey = resolveConfigValue(config, "apiKey", "NUABASE_API_KEY") || void 0;
|
|
@@ -1298,9 +1301,12 @@ class AuthTokenManager {
|
|
|
1298
1301
|
);
|
|
1299
1302
|
}
|
|
1300
1303
|
if (this.apiKey && isBrowserEnvironment()) {
|
|
1301
|
-
|
|
1302
|
-
|
|
1303
|
-
|
|
1304
|
+
const allowedLocally = config.dangerouslyAllowBrowserApiKeyInLocalhost && isLocalhost();
|
|
1305
|
+
if (!allowedLocally) {
|
|
1306
|
+
throw new Error(
|
|
1307
|
+
"found config.apiKey. It is a private secret that must only be used in server environments."
|
|
1308
|
+
);
|
|
1309
|
+
}
|
|
1304
1310
|
}
|
|
1305
1311
|
}
|
|
1306
1312
|
async getToken() {
|
|
@@ -1391,7 +1397,8 @@ class GatewayBackend {
|
|
|
1391
1397
|
const startTime = Date.now();
|
|
1392
1398
|
const response = await this.post("cast/value/now", {
|
|
1393
1399
|
input: { prompt: params.prompt, data: params.data },
|
|
1394
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1400
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1401
|
+
...params.model && { model: params.model }
|
|
1395
1402
|
});
|
|
1396
1403
|
const latencyMs = Date.now() - startTime;
|
|
1397
1404
|
if (isErrorResponse(response)) {
|
|
@@ -1422,7 +1429,8 @@ class GatewayBackend {
|
|
|
1422
1429
|
const startTime = Date.now();
|
|
1423
1430
|
const response = await this.post("cast/array/now", {
|
|
1424
1431
|
input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
|
|
1425
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1432
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1433
|
+
...params.model && { model: params.model }
|
|
1426
1434
|
});
|
|
1427
1435
|
const latencyMs = Date.now() - startTime;
|
|
1428
1436
|
if (isErrorResponse(response)) {
|
|
@@ -1452,7 +1460,8 @@ class GatewayBackend {
|
|
|
1452
1460
|
async queueCastValue(params) {
|
|
1453
1461
|
const response = await this.post("cast/value", {
|
|
1454
1462
|
input: { prompt: params.prompt, data: params.data },
|
|
1455
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1463
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1464
|
+
...params.model && { model: params.model }
|
|
1456
1465
|
});
|
|
1457
1466
|
if (isErrorResponse(response)) {
|
|
1458
1467
|
return { success: false, error: response.error, source: "gateway" };
|
|
@@ -1463,7 +1472,8 @@ class GatewayBackend {
|
|
|
1463
1472
|
async queueCastArray(params) {
|
|
1464
1473
|
const response = await this.post("cast/array", {
|
|
1465
1474
|
input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
|
|
1466
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1475
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1476
|
+
...params.model && { model: params.model }
|
|
1467
1477
|
});
|
|
1468
1478
|
if (isErrorResponse(response)) {
|
|
1469
1479
|
return { success: false, error: response.error, source: "gateway" };
|
|
@@ -1520,7 +1530,8 @@ class Nua {
|
|
|
1520
1530
|
prompt,
|
|
1521
1531
|
data: options?.input ?? null,
|
|
1522
1532
|
outputName,
|
|
1523
|
-
outputSchema: jsonSchema
|
|
1533
|
+
outputSchema: jsonSchema,
|
|
1534
|
+
model: options?.model
|
|
1524
1535
|
});
|
|
1525
1536
|
}
|
|
1526
1537
|
// ========== list() - Array Operations ==========
|
|
@@ -1540,7 +1551,8 @@ class Nua {
|
|
|
1540
1551
|
data: options.input,
|
|
1541
1552
|
primaryKey: options.primaryKey,
|
|
1542
1553
|
outputName: options.output.name,
|
|
1543
|
-
outputSchema: jsonSchema
|
|
1554
|
+
outputSchema: jsonSchema,
|
|
1555
|
+
model: options.model
|
|
1544
1556
|
});
|
|
1545
1557
|
}
|
|
1546
1558
|
// Implementation
|
|
@@ -1558,7 +1570,8 @@ class Nua {
|
|
|
1558
1570
|
prompt,
|
|
1559
1571
|
data: options?.input ?? null,
|
|
1560
1572
|
outputName,
|
|
1561
|
-
outputSchema: jsonSchema
|
|
1573
|
+
outputSchema: jsonSchema,
|
|
1574
|
+
model: options?.model
|
|
1562
1575
|
});
|
|
1563
1576
|
}
|
|
1564
1577
|
// ========== queueList() - Async Array Operations ==========
|
|
@@ -1581,7 +1594,8 @@ class Nua {
|
|
|
1581
1594
|
data: options.input,
|
|
1582
1595
|
primaryKey: options.primaryKey,
|
|
1583
1596
|
outputName: options.output.name,
|
|
1584
|
-
outputSchema: jsonSchema
|
|
1597
|
+
outputSchema: jsonSchema,
|
|
1598
|
+
model: options.model
|
|
1585
1599
|
});
|
|
1586
1600
|
}
|
|
1587
1601
|
}
|
package/dist/esm/index.mjs
CHANGED
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import { createRequire } from 'node:module';
|
|
2
1
|
import require$$0 from 'ajv';
|
|
3
2
|
import require$$1 from 'ajv/dist/2019';
|
|
4
3
|
import require$$2 from 'ajv/dist/2020';
|
|
@@ -13,9 +12,6 @@ var nuaLlmClient = {};
|
|
|
13
12
|
|
|
14
13
|
var logger = {};
|
|
15
14
|
|
|
16
|
-
const require$1 = createRequire(import.meta.url);
|
|
17
|
-
function __require() { return require$1("node:crypto"); }
|
|
18
|
-
|
|
19
15
|
var hasRequiredLogger;
|
|
20
16
|
function requireLogger() {
|
|
21
17
|
if (hasRequiredLogger) return logger;
|
|
@@ -25,7 +21,6 @@ function requireLogger() {
|
|
|
25
21
|
logger.truncateText = truncateText;
|
|
26
22
|
logger.pickHeaders = pickHeaders;
|
|
27
23
|
logger.normalizeError = normalizeError;
|
|
28
|
-
const node_crypto_1 = __require();
|
|
29
24
|
class ConsoleLogger {
|
|
30
25
|
debug(message, context) {
|
|
31
26
|
console.debug(`[DEBUG] ${message}`, context || "");
|
|
@@ -41,7 +36,7 @@ function requireLogger() {
|
|
|
41
36
|
}
|
|
42
37
|
}
|
|
43
38
|
logger.ConsoleLogger = ConsoleLogger;
|
|
44
|
-
const generateSpanId = () =>
|
|
39
|
+
const generateSpanId = () => crypto.randomUUID();
|
|
45
40
|
logger.generateSpanId = generateSpanId;
|
|
46
41
|
function truncateText(text, limit = 500) {
|
|
47
42
|
const length = text.length;
|
|
@@ -1214,9 +1209,10 @@ class DirectBackend {
|
|
|
1214
1209
|
this.client = new distExports.NuaLlmClient({ providers: config.providers });
|
|
1215
1210
|
}
|
|
1216
1211
|
async castValue(params) {
|
|
1212
|
+
const model = params.model ?? this.model;
|
|
1217
1213
|
const startTime = Date.now();
|
|
1218
1214
|
const result = await this.client.castValue({
|
|
1219
|
-
model
|
|
1215
|
+
model,
|
|
1220
1216
|
input: { prompt: params.prompt, data: params.data },
|
|
1221
1217
|
output: { name: params.outputName, effectiveSchema: params.outputSchema }
|
|
1222
1218
|
});
|
|
@@ -1233,20 +1229,21 @@ class DirectBackend {
|
|
|
1233
1229
|
success: true,
|
|
1234
1230
|
data: result.data,
|
|
1235
1231
|
usage: result.usage || normalizedUsageZero,
|
|
1236
|
-
model
|
|
1232
|
+
model,
|
|
1237
1233
|
latencyMs,
|
|
1238
1234
|
source: "direct",
|
|
1239
1235
|
meta: {}
|
|
1240
1236
|
};
|
|
1241
1237
|
}
|
|
1242
1238
|
async castArray(params) {
|
|
1239
|
+
const model = params.model ?? this.model;
|
|
1243
1240
|
const startTime = Date.now();
|
|
1244
1241
|
const wrappedSchema = distExports.wrapArraySchema(params.outputSchema, {
|
|
1245
1242
|
primaryKey: params.primaryKey,
|
|
1246
1243
|
outputName: params.outputName
|
|
1247
1244
|
});
|
|
1248
1245
|
const result = await this.client.castArray({
|
|
1249
|
-
model
|
|
1246
|
+
model,
|
|
1250
1247
|
data: params.data,
|
|
1251
1248
|
input: { prompt: params.prompt, primaryKey: params.primaryKey },
|
|
1252
1249
|
output: { name: params.outputName, effectiveSchema: wrappedSchema }
|
|
@@ -1264,7 +1261,7 @@ class DirectBackend {
|
|
|
1264
1261
|
success: true,
|
|
1265
1262
|
data: result.data,
|
|
1266
1263
|
usage: result.usage || normalizedUsageZero,
|
|
1267
|
-
model
|
|
1264
|
+
model,
|
|
1268
1265
|
latencyMs,
|
|
1269
1266
|
source: "direct",
|
|
1270
1267
|
meta: {}
|
|
@@ -1283,6 +1280,13 @@ function resolveConfigValue(config, key, envVar) {
|
|
|
1283
1280
|
}
|
|
1284
1281
|
|
|
1285
1282
|
const isBrowserEnvironment = () => typeof window !== "undefined" && !!window.document;
|
|
1283
|
+
const isLocalhost = () => {
|
|
1284
|
+
if (typeof window === "undefined" || !window.location) {
|
|
1285
|
+
return false;
|
|
1286
|
+
}
|
|
1287
|
+
const host = window.location.hostname;
|
|
1288
|
+
return host === "localhost" || host === "127.0.0.1";
|
|
1289
|
+
};
|
|
1286
1290
|
class AuthTokenManager {
|
|
1287
1291
|
constructor(config) {
|
|
1288
1292
|
this.apiKey = resolveConfigValue(config, "apiKey", "NUABASE_API_KEY") || void 0;
|
|
@@ -1296,9 +1300,12 @@ class AuthTokenManager {
|
|
|
1296
1300
|
);
|
|
1297
1301
|
}
|
|
1298
1302
|
if (this.apiKey && isBrowserEnvironment()) {
|
|
1299
|
-
|
|
1300
|
-
|
|
1301
|
-
|
|
1303
|
+
const allowedLocally = config.dangerouslyAllowBrowserApiKeyInLocalhost && isLocalhost();
|
|
1304
|
+
if (!allowedLocally) {
|
|
1305
|
+
throw new Error(
|
|
1306
|
+
"found config.apiKey. It is a private secret that must only be used in server environments."
|
|
1307
|
+
);
|
|
1308
|
+
}
|
|
1302
1309
|
}
|
|
1303
1310
|
}
|
|
1304
1311
|
async getToken() {
|
|
@@ -1389,7 +1396,8 @@ class GatewayBackend {
|
|
|
1389
1396
|
const startTime = Date.now();
|
|
1390
1397
|
const response = await this.post("cast/value/now", {
|
|
1391
1398
|
input: { prompt: params.prompt, data: params.data },
|
|
1392
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1399
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1400
|
+
...params.model && { model: params.model }
|
|
1393
1401
|
});
|
|
1394
1402
|
const latencyMs = Date.now() - startTime;
|
|
1395
1403
|
if (isErrorResponse(response)) {
|
|
@@ -1420,7 +1428,8 @@ class GatewayBackend {
|
|
|
1420
1428
|
const startTime = Date.now();
|
|
1421
1429
|
const response = await this.post("cast/array/now", {
|
|
1422
1430
|
input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
|
|
1423
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1431
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1432
|
+
...params.model && { model: params.model }
|
|
1424
1433
|
});
|
|
1425
1434
|
const latencyMs = Date.now() - startTime;
|
|
1426
1435
|
if (isErrorResponse(response)) {
|
|
@@ -1450,7 +1459,8 @@ class GatewayBackend {
|
|
|
1450
1459
|
async queueCastValue(params) {
|
|
1451
1460
|
const response = await this.post("cast/value", {
|
|
1452
1461
|
input: { prompt: params.prompt, data: params.data },
|
|
1453
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1462
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1463
|
+
...params.model && { model: params.model }
|
|
1454
1464
|
});
|
|
1455
1465
|
if (isErrorResponse(response)) {
|
|
1456
1466
|
return { success: false, error: response.error, source: "gateway" };
|
|
@@ -1461,7 +1471,8 @@ class GatewayBackend {
|
|
|
1461
1471
|
async queueCastArray(params) {
|
|
1462
1472
|
const response = await this.post("cast/array", {
|
|
1463
1473
|
input: { prompt: params.prompt, data: params.data, primaryKey: params.primaryKey },
|
|
1464
|
-
output: { name: params.outputName, schema: params.outputSchema }
|
|
1474
|
+
output: { name: params.outputName, schema: params.outputSchema },
|
|
1475
|
+
...params.model && { model: params.model }
|
|
1465
1476
|
});
|
|
1466
1477
|
if (isErrorResponse(response)) {
|
|
1467
1478
|
return { success: false, error: response.error, source: "gateway" };
|
|
@@ -1518,7 +1529,8 @@ class Nua {
|
|
|
1518
1529
|
prompt,
|
|
1519
1530
|
data: options?.input ?? null,
|
|
1520
1531
|
outputName,
|
|
1521
|
-
outputSchema: jsonSchema
|
|
1532
|
+
outputSchema: jsonSchema,
|
|
1533
|
+
model: options?.model
|
|
1522
1534
|
});
|
|
1523
1535
|
}
|
|
1524
1536
|
// ========== list() - Array Operations ==========
|
|
@@ -1538,7 +1550,8 @@ class Nua {
|
|
|
1538
1550
|
data: options.input,
|
|
1539
1551
|
primaryKey: options.primaryKey,
|
|
1540
1552
|
outputName: options.output.name,
|
|
1541
|
-
outputSchema: jsonSchema
|
|
1553
|
+
outputSchema: jsonSchema,
|
|
1554
|
+
model: options.model
|
|
1542
1555
|
});
|
|
1543
1556
|
}
|
|
1544
1557
|
// Implementation
|
|
@@ -1556,7 +1569,8 @@ class Nua {
|
|
|
1556
1569
|
prompt,
|
|
1557
1570
|
data: options?.input ?? null,
|
|
1558
1571
|
outputName,
|
|
1559
|
-
outputSchema: jsonSchema
|
|
1572
|
+
outputSchema: jsonSchema,
|
|
1573
|
+
model: options?.model
|
|
1560
1574
|
});
|
|
1561
1575
|
}
|
|
1562
1576
|
// ========== queueList() - Async Array Operations ==========
|
|
@@ -1579,7 +1593,8 @@ class Nua {
|
|
|
1579
1593
|
data: options.input,
|
|
1580
1594
|
primaryKey: options.primaryKey,
|
|
1581
1595
|
outputName: options.output.name,
|
|
1582
|
-
outputSchema: jsonSchema
|
|
1596
|
+
outputSchema: jsonSchema,
|
|
1597
|
+
model: options.model
|
|
1583
1598
|
});
|
|
1584
1599
|
}
|
|
1585
1600
|
}
|
|
@@ -3,6 +3,7 @@ export type CastValueParams = {
|
|
|
3
3
|
data: unknown;
|
|
4
4
|
outputName: string;
|
|
5
5
|
outputSchema: object;
|
|
6
|
+
model?: string;
|
|
6
7
|
};
|
|
7
8
|
export type CastArrayParams = {
|
|
8
9
|
prompt: string;
|
|
@@ -10,6 +11,7 @@ export type CastArrayParams = {
|
|
|
10
11
|
primaryKey: string;
|
|
11
12
|
outputName: string;
|
|
12
13
|
outputSchema: object;
|
|
14
|
+
model?: string;
|
|
13
15
|
};
|
|
14
16
|
export type NormalizedUsage = {
|
|
15
17
|
promptTokens: number;
|
package/dist/types/lib/auth.d.ts
CHANGED
package/dist/types/nua.d.ts
CHANGED
|
@@ -9,11 +9,13 @@ export type OutputDef<TSchema extends z.ZodTypeAny> = {
|
|
|
9
9
|
export type GetOptions<TSchema extends z.ZodTypeAny> = {
|
|
10
10
|
input?: unknown;
|
|
11
11
|
output: OutputDef<TSchema>;
|
|
12
|
+
model?: string;
|
|
12
13
|
};
|
|
13
14
|
export type ListOptions<TSchema extends z.ZodTypeAny, TData extends Record<string, unknown>, PrimaryKey extends keyof TData & string> = {
|
|
14
15
|
input: TData[];
|
|
15
16
|
primaryKey: PrimaryKey;
|
|
16
17
|
output: OutputDef<TSchema>;
|
|
18
|
+
model?: string;
|
|
17
19
|
};
|
|
18
20
|
export type ListResultRow<TSchema extends z.ZodTypeAny, PrimaryKey extends string> = {
|
|
19
21
|
[K in PrimaryKey]: string | number;
|
package/package.json
CHANGED