proto.io 0.0.161 → 0.0.163
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/adapters/file/database.d.ts +2 -2
- package/dist/adapters/file/database.mjs +2 -2
- package/dist/adapters/file/filesystem.d.ts +2 -2
- package/dist/adapters/file/google-cloud-storage.d.ts +2 -2
- package/dist/adapters/storage/progres.d.ts +1 -1
- package/dist/adapters/storage/progres.mjs +3 -3
- package/dist/client.d.ts +3 -3
- package/dist/client.js +1 -1
- package/dist/client.mjs +3 -3
- package/dist/index.d.ts +3 -3
- package/dist/index.js +117 -59
- package/dist/index.js.map +1 -1
- package/dist/index.mjs +121 -63
- package/dist/index.mjs.map +1 -1
- package/dist/internals/{index-2EQQyKaU.d.ts → index-BeV63sFw.d.ts} +2 -2
- package/dist/internals/index-BeV63sFw.d.ts.map +1 -0
- package/dist/internals/{index-B01TqoO1.mjs → index-BoP4kl2R.mjs} +49 -25
- package/dist/internals/index-BoP4kl2R.mjs.map +1 -0
- package/dist/internals/{index-CHKUNXoz.d.ts → index-BsuUdR0W.d.ts} +3 -3
- package/dist/internals/index-BsuUdR0W.d.ts.map +1 -0
- package/dist/internals/{index-BmRuvHVZ.mjs → index-ByfpVHca.mjs} +2 -2
- package/dist/internals/index-ByfpVHca.mjs.map +1 -0
- package/dist/internals/index-CVutVPmd.js.map +1 -1
- package/dist/internals/{index-Bs06MNCK.js → index-Dz3jvqxZ.js} +48 -24
- package/dist/internals/index-Dz3jvqxZ.js.map +1 -0
- package/dist/internals/{index-tU-lsQqj.mjs → index-S5Bq-KsU.mjs} +2 -2
- package/dist/internals/{index-tU-lsQqj.mjs.map → index-S5Bq-KsU.mjs.map} +1 -1
- package/dist/internals/{index-CXLttbg-.d.ts → index-YdOGTHp1.d.ts} +5 -6
- package/dist/internals/index-YdOGTHp1.d.ts.map +1 -0
- package/dist/internals/{random-DifCxbl6.mjs → random-w8WDYQEe.mjs} +4 -4
- package/dist/internals/{random-DifCxbl6.mjs.map → random-w8WDYQEe.mjs.map} +1 -1
- package/package.json +1 -1
- package/dist/internals/index-2EQQyKaU.d.ts.map +0 -1
- package/dist/internals/index-B01TqoO1.mjs.map +0 -1
- package/dist/internals/index-BmRuvHVZ.mjs.map +0 -1
- package/dist/internals/index-Bs06MNCK.js.map +0 -1
- package/dist/internals/index-CHKUNXoz.d.ts.map +0 -1
- package/dist/internals/index-CXLttbg-.d.ts.map +0 -1
package/dist/index.mjs
CHANGED
|
@@ -1,18 +1,18 @@
|
|
|
1
1
|
import _ from 'lodash';
|
|
2
2
|
import { Server } from '@o2ter/server-js';
|
|
3
|
-
import { Q as QueryValidator, g as generateId,
|
|
3
|
+
import { Q as QueryValidator, r as resolveColumn, g as generateId, a as resolveDataType } from './internals/random-w8WDYQEe.mjs';
|
|
4
4
|
import { P as PVK } from './internals/private-BUpLAMZi.mjs';
|
|
5
5
|
import { asyncStream, asyncIterableToArray, isBinaryData, base64ToBuffer } from '@o2ter/utils-js';
|
|
6
|
-
import { T as TQuery, M as MASTER_USER_HEADER_NAME, a as MASTER_PASS_HEADER_NAME, A as AUTH_COOKIE_KEY, b as TUser, P as ProtoType, s as serialize, d as deserialize, U as UPLOAD_TOKEN_HEADER_NAME } from './internals/index-
|
|
7
|
-
export { c as ProtoClient, e as classExtends, j as isFile, f as isObject, i as isQuery, h as isRole, g as isUser } from './internals/index-
|
|
8
|
-
import {
|
|
6
|
+
import { T as TQuery, M as MASTER_USER_HEADER_NAME, a as MASTER_PASS_HEADER_NAME, A as AUTH_COOKIE_KEY, b as TUser, P as ProtoType, s as serialize, d as deserialize, U as UPLOAD_TOKEN_HEADER_NAME } from './internals/index-BoP4kl2R.mjs';
|
|
7
|
+
export { c as ProtoClient, e as classExtends, j as isFile, f as isObject, i as isQuery, h as isRole, g as isUser } from './internals/index-BoP4kl2R.mjs';
|
|
8
|
+
import { i as isPointer, a as isRelation, d as decodeUpdateOp, T as TObject, b as isShape, c as defaultObjectKeyTypes, e as isPrimitive } from './internals/index-ByfpVHca.mjs';
|
|
9
9
|
import jwt from 'jsonwebtoken';
|
|
10
10
|
import { Blob } from 'node:buffer';
|
|
11
11
|
import { Readable } from 'node:stream';
|
|
12
12
|
import { scrypt } from 'node:crypto';
|
|
13
13
|
import { promisify } from 'util';
|
|
14
14
|
import { randomBytes, randomUUID } from '@o2ter/crypto-js';
|
|
15
|
-
import { Q as QuerySelector } from './internals/index-
|
|
15
|
+
import { Q as QuerySelector } from './internals/index-S5Bq-KsU.mjs';
|
|
16
16
|
import queryType from 'query-types';
|
|
17
17
|
import busboy from 'busboy';
|
|
18
18
|
export { Decimal } from 'decimal.js';
|
|
@@ -316,19 +316,19 @@ const _serviceOf = (options) => options?.session instanceof ProtoService ? optio
|
|
|
316
316
|
// OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
317
317
|
// THE SOFTWARE.
|
|
318
318
|
//
|
|
319
|
-
class
|
|
319
|
+
class _ProtoQuery extends TQuery {
|
|
320
320
|
_proto;
|
|
321
321
|
_opts;
|
|
322
|
-
constructor(
|
|
323
|
-
super(
|
|
322
|
+
constructor(proto, opts) {
|
|
323
|
+
super();
|
|
324
324
|
this._proto = proto;
|
|
325
325
|
this._opts = opts;
|
|
326
326
|
}
|
|
327
327
|
get _queryOptions() {
|
|
328
328
|
return {
|
|
329
|
+
...this[PVK].options,
|
|
329
330
|
className: this.className,
|
|
330
331
|
relatedBy: this._opts.relatedBy,
|
|
331
|
-
...this[PVK].options,
|
|
332
332
|
};
|
|
333
333
|
}
|
|
334
334
|
_dispatcher(options) {
|
|
@@ -344,11 +344,6 @@ class ProtoQuery extends TQuery {
|
|
|
344
344
|
count(options) {
|
|
345
345
|
return this._dispatcher(options).count(this._queryOptions);
|
|
346
346
|
}
|
|
347
|
-
clone(options) {
|
|
348
|
-
const clone = new ProtoQuery(this.className, this._proto, this._opts);
|
|
349
|
-
clone[PVK].options = options ?? { ...this[PVK].options };
|
|
350
|
-
return clone;
|
|
351
|
-
}
|
|
352
347
|
_objectMethods(object) {
|
|
353
348
|
return this._proto.rebind(object);
|
|
354
349
|
}
|
|
@@ -538,6 +533,38 @@ class ProtoQuery extends TQuery {
|
|
|
538
533
|
return this._dispatcher(options).deleteMany(this._queryOptions);
|
|
539
534
|
}
|
|
540
535
|
}
|
|
536
|
+
class ProtoQuery extends _ProtoQuery {
|
|
537
|
+
_className;
|
|
538
|
+
constructor(className, proto, opts) {
|
|
539
|
+
super(proto, opts);
|
|
540
|
+
this._className = className;
|
|
541
|
+
}
|
|
542
|
+
get className() {
|
|
543
|
+
return this._className;
|
|
544
|
+
}
|
|
545
|
+
clone(options) {
|
|
546
|
+
const clone = new ProtoQuery(this.className, this._proto, this._opts);
|
|
547
|
+
clone[PVK].options = options ?? { ...this[PVK].options };
|
|
548
|
+
return clone;
|
|
549
|
+
}
|
|
550
|
+
}
|
|
551
|
+
class ProtoRelationQuery extends _ProtoQuery {
|
|
552
|
+
constructor(proto, opts) {
|
|
553
|
+
super(proto, opts);
|
|
554
|
+
}
|
|
555
|
+
get className() {
|
|
556
|
+
const { className, key } = this._opts.relatedBy;
|
|
557
|
+
const { dataType } = resolveColumn(this._proto.schema, className, key);
|
|
558
|
+
if (!isPointer(dataType) && !isRelation(dataType))
|
|
559
|
+
throw Error(`Invalid relation key: ${key}`);
|
|
560
|
+
return dataType.target;
|
|
561
|
+
}
|
|
562
|
+
clone(options) {
|
|
563
|
+
const clone = new ProtoRelationQuery(this._proto, this._opts);
|
|
564
|
+
clone[PVK].options = options ?? { ...this[PVK].options };
|
|
565
|
+
return clone;
|
|
566
|
+
}
|
|
567
|
+
}
|
|
541
568
|
|
|
542
569
|
//
|
|
543
570
|
// defaults.ts
|
|
@@ -1381,11 +1408,11 @@ class ProtoService extends ProtoType {
|
|
|
1381
1408
|
Query(className) {
|
|
1382
1409
|
return new ProtoQuery(className, this, {});
|
|
1383
1410
|
}
|
|
1384
|
-
Relation(
|
|
1411
|
+
Relation(object, key) {
|
|
1385
1412
|
const objectId = object.objectId;
|
|
1386
1413
|
if (!objectId)
|
|
1387
1414
|
throw Error('Invalid object');
|
|
1388
|
-
return new
|
|
1415
|
+
return new ProtoRelationQuery(this, {
|
|
1389
1416
|
relatedBy: {
|
|
1390
1417
|
className: object.className,
|
|
1391
1418
|
objectId,
|
|
@@ -1670,64 +1697,70 @@ const verifyRelatedBy = (relatedBy) => {
|
|
|
1670
1697
|
throw Error('Invalid option');
|
|
1671
1698
|
};
|
|
1672
1699
|
var classesRoute = (router, proto) => {
|
|
1700
|
+
const defaultHandler = async (req) => {
|
|
1701
|
+
const { name } = req.params;
|
|
1702
|
+
const { operation, context, silent, random, attributes, update, setOnInsert, relatedBy, ...options } = deserialize(req.body);
|
|
1703
|
+
verifyRelatedBy(relatedBy);
|
|
1704
|
+
const payload = proto.connect(req);
|
|
1705
|
+
const query = relatedBy ? payload.Relation(payload.Object(relatedBy.className, relatedBy.objectId), relatedBy.key) : payload.Query(name);
|
|
1706
|
+
query[PVK].options = options;
|
|
1707
|
+
const opts = { master: payload.isMaster, context, silent };
|
|
1708
|
+
switch (operation) {
|
|
1709
|
+
case 'explain':
|
|
1710
|
+
if (!payload.isMaster)
|
|
1711
|
+
throw Error('No permission');
|
|
1712
|
+
return query.explain(opts);
|
|
1713
|
+
case 'count': return query.count(opts);
|
|
1714
|
+
case 'find':
|
|
1715
|
+
{
|
|
1716
|
+
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1717
|
+
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1718
|
+
if (query[PVK].options.limit > maxFetchLimit)
|
|
1719
|
+
throw Error('Query over limit');
|
|
1720
|
+
return await query.find(opts);
|
|
1721
|
+
}
|
|
1722
|
+
case 'random':
|
|
1723
|
+
{
|
|
1724
|
+
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1725
|
+
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1726
|
+
if (query[PVK].options.limit > maxFetchLimit)
|
|
1727
|
+
throw Error('Query over limit');
|
|
1728
|
+
return await query.random(random, opts);
|
|
1729
|
+
}
|
|
1730
|
+
case 'nonrefs':
|
|
1731
|
+
{
|
|
1732
|
+
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1733
|
+
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1734
|
+
if (query[PVK].options.limit > maxFetchLimit)
|
|
1735
|
+
throw Error('Query over limit');
|
|
1736
|
+
return await query.nonrefs(opts);
|
|
1737
|
+
}
|
|
1738
|
+
case 'insert': return query.insert(attributes, opts);
|
|
1739
|
+
case 'insertMany': return query.insertMany(attributes, opts);
|
|
1740
|
+
case 'updateOne': return query.updateOne(update, opts);
|
|
1741
|
+
case 'upsertOne': return query.upsertOne(update, setOnInsert, opts);
|
|
1742
|
+
case 'deleteOne': return query.deleteOne(opts);
|
|
1743
|
+
case 'deleteMany': return query.deleteMany(opts);
|
|
1744
|
+
default: throw Error('Invalid operation');
|
|
1745
|
+
}
|
|
1746
|
+
};
|
|
1673
1747
|
router.post('/classes/:name', Server.text({ type: '*/*' }), async (req, res) => {
|
|
1674
1748
|
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1675
1749
|
const { name } = req.params;
|
|
1676
1750
|
const classes = proto.classes();
|
|
1677
1751
|
if (!_.includes(classes, name))
|
|
1678
1752
|
return res.sendStatus(404);
|
|
1679
|
-
await response(res,
|
|
1680
|
-
|
|
1681
|
-
|
|
1682
|
-
|
|
1683
|
-
|
|
1684
|
-
query[PVK].options = options;
|
|
1685
|
-
const opts = { master: payload.isMaster, context, silent };
|
|
1686
|
-
switch (operation) {
|
|
1687
|
-
case 'explain':
|
|
1688
|
-
if (!payload.isMaster)
|
|
1689
|
-
throw Error('No permission');
|
|
1690
|
-
return query.explain(opts);
|
|
1691
|
-
case 'count': return query.count(opts);
|
|
1692
|
-
case 'find':
|
|
1693
|
-
{
|
|
1694
|
-
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1695
|
-
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1696
|
-
if (query[PVK].options.limit > maxFetchLimit)
|
|
1697
|
-
throw Error('Query over limit');
|
|
1698
|
-
return await query.find(opts);
|
|
1699
|
-
}
|
|
1700
|
-
case 'random':
|
|
1701
|
-
{
|
|
1702
|
-
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1703
|
-
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1704
|
-
if (query[PVK].options.limit > maxFetchLimit)
|
|
1705
|
-
throw Error('Query over limit');
|
|
1706
|
-
return await query.random(random, opts);
|
|
1707
|
-
}
|
|
1708
|
-
case 'nonrefs':
|
|
1709
|
-
{
|
|
1710
|
-
const maxFetchLimit = payload[PVK].options.maxFetchLimit;
|
|
1711
|
-
query[PVK].options.limit = query[PVK].options.limit ?? maxFetchLimit;
|
|
1712
|
-
if (query[PVK].options.limit > maxFetchLimit)
|
|
1713
|
-
throw Error('Query over limit');
|
|
1714
|
-
return await query.nonrefs(opts);
|
|
1715
|
-
}
|
|
1716
|
-
case 'insert': return query.insert(attributes, opts);
|
|
1717
|
-
case 'insertMany': return query.insertMany(attributes, opts);
|
|
1718
|
-
case 'updateOne': return query.updateOne(update, opts);
|
|
1719
|
-
case 'upsertOne': return query.upsertOne(update, setOnInsert, opts);
|
|
1720
|
-
case 'deleteOne': return query.deleteOne(opts);
|
|
1721
|
-
case 'deleteMany': return query.deleteMany(opts);
|
|
1722
|
-
default: throw Error('Invalid operation');
|
|
1723
|
-
}
|
|
1724
|
-
});
|
|
1753
|
+
await response(res, () => defaultHandler(req));
|
|
1754
|
+
});
|
|
1755
|
+
router.post('/relation', Server.text({ type: '*/*' }), async (req, res) => {
|
|
1756
|
+
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1757
|
+
await response(res, () => defaultHandler(req));
|
|
1725
1758
|
});
|
|
1726
1759
|
const createQuery = (payload, req, checkLimit) => {
|
|
1727
1760
|
const { name } = req.params;
|
|
1728
1761
|
const { filter, sort, includes, skip, limit, relatedBy, } = req.query;
|
|
1729
1762
|
verifyRelatedBy(relatedBy);
|
|
1730
|
-
const query = relatedBy ? payload.Relation(
|
|
1763
|
+
const query = relatedBy ? payload.Relation(payload.Object(relatedBy.className, relatedBy.objectId), relatedBy.key) : payload.Query(name);
|
|
1731
1764
|
query[PVK].options.filter = !_.isEmpty(filter) && _.isString(filter) ? _.castArray(deserialize(filter)) : [];
|
|
1732
1765
|
query[PVK].options.sort = _.isPlainObject(sort) && _.every(_.values(sort), _.isNumber) ? sort : undefined;
|
|
1733
1766
|
query[PVK].options.includes = _.isArray(includes) && _.every(includes, _.isString) ? includes : undefined;
|
|
@@ -1752,6 +1785,11 @@ var classesRoute = (router, proto) => {
|
|
|
1752
1785
|
const payload = proto.connect(req);
|
|
1753
1786
|
await response(res, async () => createQuery(payload, req, true).find({ master: payload.isMaster }));
|
|
1754
1787
|
});
|
|
1788
|
+
router.get('/relation', queryType.middleware(), async (req, res) => {
|
|
1789
|
+
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1790
|
+
const payload = proto.connect(req);
|
|
1791
|
+
await response(res, async () => createQuery(payload, req, true).find({ master: payload.isMaster }));
|
|
1792
|
+
});
|
|
1755
1793
|
router.get('/classes/:name/random', queryType.middleware(), async (req, res) => {
|
|
1756
1794
|
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1757
1795
|
const { name } = req.params;
|
|
@@ -1764,6 +1802,14 @@ var classesRoute = (router, proto) => {
|
|
|
1764
1802
|
throw Error('Invalid operation');
|
|
1765
1803
|
await response(res, async () => createQuery(payload, req, true).random({ weight }, { master: payload.isMaster }));
|
|
1766
1804
|
});
|
|
1805
|
+
router.get('/relation/random', queryType.middleware(), async (req, res) => {
|
|
1806
|
+
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1807
|
+
const payload = proto.connect(req);
|
|
1808
|
+
const { weight } = req.query;
|
|
1809
|
+
if (_.isEmpty(weight) || !_.isString(weight))
|
|
1810
|
+
throw Error('Invalid operation');
|
|
1811
|
+
await response(res, async () => createQuery(payload, req, true).random({ weight }, { master: payload.isMaster }));
|
|
1812
|
+
});
|
|
1767
1813
|
router.get('/classes/:name/nonrefs', queryType.middleware(), async (req, res) => {
|
|
1768
1814
|
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1769
1815
|
const { name } = req.params;
|
|
@@ -1773,6 +1819,11 @@ var classesRoute = (router, proto) => {
|
|
|
1773
1819
|
const payload = proto.connect(req);
|
|
1774
1820
|
await response(res, async () => createQuery(payload, req, true).nonrefs({ master: payload.isMaster }));
|
|
1775
1821
|
});
|
|
1822
|
+
router.get('/relation/nonrefs', queryType.middleware(), async (req, res) => {
|
|
1823
|
+
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1824
|
+
const payload = proto.connect(req);
|
|
1825
|
+
await response(res, async () => createQuery(payload, req, true).nonrefs({ master: payload.isMaster }));
|
|
1826
|
+
});
|
|
1776
1827
|
router.get('/classes/:name/:id', async (req, res) => {
|
|
1777
1828
|
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1778
1829
|
const { name, id } = req.params;
|
|
@@ -1813,6 +1864,13 @@ var classesRoute = (router, proto) => {
|
|
|
1813
1864
|
const payload = proto.connect(req);
|
|
1814
1865
|
await response(res, () => createQuery(payload, req, false).deleteMany({ master: payload.isMaster }));
|
|
1815
1866
|
});
|
|
1867
|
+
router.delete('/relation', Server.text({ type: '*/*' }), async (req, res) => {
|
|
1868
|
+
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1869
|
+
if (!_.isEmpty(req.body))
|
|
1870
|
+
return res.sendStatus(400);
|
|
1871
|
+
const payload = proto.connect(req);
|
|
1872
|
+
await response(res, () => createQuery(payload, req, false).deleteMany({ master: payload.isMaster }));
|
|
1873
|
+
});
|
|
1816
1874
|
router.delete('/classes/:name/:id', Server.text({ type: '*/*' }), async (req, res) => {
|
|
1817
1875
|
res.setHeader('Cache-Control', ['no-cache', 'no-store']);
|
|
1818
1876
|
if (!_.isEmpty(req.body))
|