@diister/quick-permission 0.9.0-beta.5
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 +747 -0
- package/aggregation.ts +114 -0
- package/core/filtering.ts +70 -0
- package/core/matching.ts +82 -0
- package/core/merging.ts +143 -0
- package/dist/aggregation.d.ts +62 -0
- package/dist/aggregation.d.ts.map +1 -0
- package/dist/aggregation.js +97 -0
- package/dist/aggregation.js.map +1 -0
- package/dist/core/filtering.d.ts +35 -0
- package/dist/core/filtering.d.ts.map +1 -0
- package/dist/core/filtering.js +62 -0
- package/dist/core/filtering.js.map +1 -0
- package/dist/core/matching.d.ts +31 -0
- package/dist/core/matching.d.ts.map +1 -0
- package/dist/core/matching.js +75 -0
- package/dist/core/matching.js.map +1 -0
- package/dist/core/merging.d.ts +29 -0
- package/dist/core/merging.d.ts.map +1 -0
- package/dist/core/merging.js +124 -0
- package/dist/core/merging.js.map +1 -0
- package/dist/indirect-aggregation.d.ts +41 -0
- package/dist/indirect-aggregation.d.ts.map +1 -0
- package/dist/indirect-aggregation.js +185 -0
- package/dist/indirect-aggregation.js.map +1 -0
- package/dist/indirect-resource.d.ts +126 -0
- package/dist/indirect-resource.d.ts.map +1 -0
- package/dist/indirect-resource.js +109 -0
- package/dist/indirect-resource.js.map +1 -0
- package/dist/mod.d.ts +25 -0
- package/dist/mod.d.ts.map +1 -0
- package/dist/mod.js +25 -0
- package/dist/mod.js.map +1 -0
- package/dist/mongo-query.d.ts +38 -0
- package/dist/mongo-query.d.ts.map +1 -0
- package/dist/mongo-query.js +88 -0
- package/dist/mongo-query.js.map +1 -0
- package/dist/permission.d.ts +57 -0
- package/dist/permission.d.ts.map +1 -0
- package/dist/permission.js +60 -0
- package/dist/permission.js.map +1 -0
- package/dist/resource.d.ts +48 -0
- package/dist/resource.d.ts.map +1 -0
- package/dist/resource.js +298 -0
- package/dist/resource.js.map +1 -0
- package/dist/rules.d.ts +106 -0
- package/dist/rules.d.ts.map +1 -0
- package/dist/rules.js +183 -0
- package/dist/rules.js.map +1 -0
- package/dist/sift/core.d.ts +104 -0
- package/dist/sift/core.d.ts.map +1 -0
- package/dist/sift/core.js +248 -0
- package/dist/sift/core.js.map +1 -0
- package/dist/sift/index.d.ts +10 -0
- package/dist/sift/index.d.ts.map +1 -0
- package/dist/sift/index.js +18 -0
- package/dist/sift/index.js.map +1 -0
- package/dist/sift/operations.d.ts +87 -0
- package/dist/sift/operations.d.ts.map +1 -0
- package/dist/sift/operations.js +257 -0
- package/dist/sift/operations.js.map +1 -0
- package/dist/sift/utils.d.ts +12 -0
- package/dist/sift/utils.d.ts.map +1 -0
- package/dist/sift/utils.js +80 -0
- package/dist/sift/utils.js.map +1 -0
- package/dist/system.d.ts +113 -0
- package/dist/system.d.ts.map +1 -0
- package/dist/system.js +712 -0
- package/dist/system.js.map +1 -0
- package/dist/target.d.ts +18 -0
- package/dist/target.d.ts.map +1 -0
- package/dist/target.js +41 -0
- package/dist/target.js.map +1 -0
- package/dist/types.d.ts +345 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +10 -0
- package/dist/types.js.map +1 -0
- package/indirect-aggregation.ts +216 -0
- package/indirect-resource.ts +205 -0
- package/mod.ts +81 -0
- package/mongo-query.ts +94 -0
- package/package.json +58 -0
- package/permission.ts +88 -0
- package/resource.ts +352 -0
- package/rules.ts +241 -0
- package/sift/MIT-LICENSE.txt +20 -0
- package/sift/core.ts +551 -0
- package/sift/index.ts +62 -0
- package/sift/operations.ts +449 -0
- package/sift/utils.ts +96 -0
- package/system.ts +974 -0
- package/target.ts +84 -0
- package/types.ts +408 -0
|
@@ -0,0 +1,257 @@
|
|
|
1
|
+
// Vendored from sift.js (https://github.com/crcn/sift.js) — MIT licensed.
|
|
2
|
+
// `$where` operator removed (security: arbitrary code execution).
|
|
3
|
+
import { BaseOperation, containsOperation, createQueryOperation, createTester, EqualsOperation, NamedGroupOperation, numericalOperation, } from "./core.js";
|
|
4
|
+
import { comparable, isArray } from "./utils.js";
|
|
5
|
+
class $Ne extends BaseOperation {
|
|
6
|
+
propop = true;
|
|
7
|
+
init() {
|
|
8
|
+
this._test = createTester(this.params, this.options.compare);
|
|
9
|
+
}
|
|
10
|
+
reset() {
|
|
11
|
+
super.reset();
|
|
12
|
+
this.keep = true;
|
|
13
|
+
}
|
|
14
|
+
next(item) {
|
|
15
|
+
if (this._test(item)) {
|
|
16
|
+
this.done = true;
|
|
17
|
+
this.keep = false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
class $ElemMatch extends BaseOperation {
|
|
22
|
+
propop = true;
|
|
23
|
+
init() {
|
|
24
|
+
if (!this.params || typeof this.params !== "object") {
|
|
25
|
+
throw new Error(`Malformed query. $elemMatch must by an object.`);
|
|
26
|
+
}
|
|
27
|
+
this._queryOperation = createQueryOperation(this.params, this.owneryQuery, this.options);
|
|
28
|
+
}
|
|
29
|
+
reset() {
|
|
30
|
+
super.reset();
|
|
31
|
+
this._queryOperation.reset();
|
|
32
|
+
}
|
|
33
|
+
next(item) {
|
|
34
|
+
if (isArray(item)) {
|
|
35
|
+
for (let i = 0, { length } = item; i < length; i++) {
|
|
36
|
+
// Reset between elements: a passing element must satisfy ALL child ops on its own.
|
|
37
|
+
this._queryOperation.reset();
|
|
38
|
+
const child = item[i];
|
|
39
|
+
this._queryOperation.next(child, i, item, false);
|
|
40
|
+
this.keep = this.keep || this._queryOperation.keep;
|
|
41
|
+
}
|
|
42
|
+
this.done = true;
|
|
43
|
+
}
|
|
44
|
+
else {
|
|
45
|
+
this.done = false;
|
|
46
|
+
this.keep = false;
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
}
|
|
50
|
+
class $Not extends BaseOperation {
|
|
51
|
+
propop = true;
|
|
52
|
+
init() {
|
|
53
|
+
this._queryOperation = createQueryOperation(this.params, this.owneryQuery, this.options);
|
|
54
|
+
}
|
|
55
|
+
reset() {
|
|
56
|
+
super.reset();
|
|
57
|
+
this._queryOperation.reset();
|
|
58
|
+
}
|
|
59
|
+
next(item, key, owner, root) {
|
|
60
|
+
this._queryOperation.next(item, key, owner, root);
|
|
61
|
+
this.done = this._queryOperation.done;
|
|
62
|
+
this.keep = !this._queryOperation.keep;
|
|
63
|
+
}
|
|
64
|
+
}
|
|
65
|
+
export class $Size extends BaseOperation {
|
|
66
|
+
propop = true;
|
|
67
|
+
next(item) {
|
|
68
|
+
if (isArray(item) && item.length === this.params) {
|
|
69
|
+
this.done = true;
|
|
70
|
+
this.keep = true;
|
|
71
|
+
}
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
const assertGroupNotEmpty = (values) => {
|
|
75
|
+
if (values.length === 0) {
|
|
76
|
+
throw new Error(`$and/$or/$nor must be a nonempty array`);
|
|
77
|
+
}
|
|
78
|
+
};
|
|
79
|
+
class $Or extends BaseOperation {
|
|
80
|
+
propop = false;
|
|
81
|
+
init() {
|
|
82
|
+
assertGroupNotEmpty(this.params);
|
|
83
|
+
this._ops = this.params.map((op) => createQueryOperation(op, null, this.options));
|
|
84
|
+
}
|
|
85
|
+
reset() {
|
|
86
|
+
this.done = false;
|
|
87
|
+
this.keep = false;
|
|
88
|
+
for (let i = 0, { length } = this._ops; i < length; i++) {
|
|
89
|
+
this._ops[i].reset();
|
|
90
|
+
}
|
|
91
|
+
}
|
|
92
|
+
next(item, key, owner) {
|
|
93
|
+
let done = false;
|
|
94
|
+
let success = false;
|
|
95
|
+
for (let i = 0, { length } = this._ops; i < length; i++) {
|
|
96
|
+
const op = this._ops[i];
|
|
97
|
+
op.next(item, key, owner);
|
|
98
|
+
if (op.keep) {
|
|
99
|
+
done = true;
|
|
100
|
+
success = op.keep;
|
|
101
|
+
break;
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
this.keep = success;
|
|
105
|
+
this.done = done;
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
class $Nor extends $Or {
|
|
109
|
+
propop = false;
|
|
110
|
+
next(item, key, owner) {
|
|
111
|
+
super.next(item, key, owner);
|
|
112
|
+
this.keep = !this.keep;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
class $In extends BaseOperation {
|
|
116
|
+
propop = true;
|
|
117
|
+
init() {
|
|
118
|
+
const params = Array.isArray(this.params) ? this.params : [this.params];
|
|
119
|
+
this._testers = params.map((value) => {
|
|
120
|
+
if (containsOperation(value, this.options)) {
|
|
121
|
+
throw new Error(`cannot nest $ under ${(this.name ?? "").toLowerCase()}`);
|
|
122
|
+
}
|
|
123
|
+
return createTester(value, this.options.compare);
|
|
124
|
+
});
|
|
125
|
+
}
|
|
126
|
+
next(item, _key, _owner) {
|
|
127
|
+
let done = false;
|
|
128
|
+
let success = false;
|
|
129
|
+
for (let i = 0, { length } = this._testers; i < length; i++) {
|
|
130
|
+
const test = this._testers[i];
|
|
131
|
+
if (test(item)) {
|
|
132
|
+
done = true;
|
|
133
|
+
success = true;
|
|
134
|
+
break;
|
|
135
|
+
}
|
|
136
|
+
}
|
|
137
|
+
this.keep = success;
|
|
138
|
+
this.done = done;
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
class $Nin extends BaseOperation {
|
|
142
|
+
propop = true;
|
|
143
|
+
_in;
|
|
144
|
+
constructor(params, ownerQuery, options, name) {
|
|
145
|
+
super(params, ownerQuery, options, name);
|
|
146
|
+
this._in = new $In(params, ownerQuery, options, name);
|
|
147
|
+
}
|
|
148
|
+
next(item, key, owner, root) {
|
|
149
|
+
this._in.next(item, key, owner);
|
|
150
|
+
if (isArray(owner) && !root) {
|
|
151
|
+
if (this._in.keep) {
|
|
152
|
+
this.keep = false;
|
|
153
|
+
this.done = true;
|
|
154
|
+
}
|
|
155
|
+
else if (key == owner.length - 1) {
|
|
156
|
+
this.keep = true;
|
|
157
|
+
this.done = true;
|
|
158
|
+
}
|
|
159
|
+
}
|
|
160
|
+
else {
|
|
161
|
+
this.keep = !this._in.keep;
|
|
162
|
+
this.done = true;
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
reset() {
|
|
166
|
+
super.reset();
|
|
167
|
+
this._in.reset();
|
|
168
|
+
}
|
|
169
|
+
}
|
|
170
|
+
class $Exists extends BaseOperation {
|
|
171
|
+
propop = true;
|
|
172
|
+
next(_item, key, owner, _root, leaf) {
|
|
173
|
+
if (!leaf) {
|
|
174
|
+
this.done = true;
|
|
175
|
+
this.keep = !this.params;
|
|
176
|
+
}
|
|
177
|
+
else if (owner != null &&
|
|
178
|
+
Object.prototype.hasOwnProperty.call(owner, key) ===
|
|
179
|
+
this.params) {
|
|
180
|
+
this.done = true;
|
|
181
|
+
this.keep = true;
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
class $And extends NamedGroupOperation {
|
|
186
|
+
propop = false;
|
|
187
|
+
constructor(params, owneryQuery, options, name) {
|
|
188
|
+
super(params, owneryQuery, options, params.map((query) => createQueryOperation(query, owneryQuery, options)), name);
|
|
189
|
+
assertGroupNotEmpty(params);
|
|
190
|
+
}
|
|
191
|
+
next(item, key, owner, root) {
|
|
192
|
+
this.childrenNext(item, key, owner, root ?? false);
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
class $All extends NamedGroupOperation {
|
|
196
|
+
propop = true;
|
|
197
|
+
constructor(params, owneryQuery, options, name) {
|
|
198
|
+
super(params, owneryQuery, options, params.map((query) => createQueryOperation(query, owneryQuery, options)), name);
|
|
199
|
+
}
|
|
200
|
+
next(item, key, owner, root) {
|
|
201
|
+
this.childrenNext(item, key, owner, root ?? false);
|
|
202
|
+
}
|
|
203
|
+
}
|
|
204
|
+
export const $eq = (params, owneryQuery, options) => new EqualsOperation(params, owneryQuery, options);
|
|
205
|
+
export const $ne = (params, owneryQuery, options, name) => new $Ne(params, owneryQuery, options, name);
|
|
206
|
+
export const $or = (params, owneryQuery, options, name) => new $Or(params, owneryQuery, options, name);
|
|
207
|
+
export const $nor = (params, owneryQuery, options, name) => new $Nor(params, owneryQuery, options, name);
|
|
208
|
+
export const $elemMatch = (params, owneryQuery, options, name) => new $ElemMatch(params, owneryQuery, options, name);
|
|
209
|
+
export const $nin = (params, owneryQuery, options, name) => new $Nin(params, owneryQuery, options, name);
|
|
210
|
+
export const $in = (params, owneryQuery, options, name) => new $In(params, owneryQuery, options, name);
|
|
211
|
+
export const $lt = numericalOperation((params) => (b) => b != null && b < params);
|
|
212
|
+
export const $lte = numericalOperation((params) => (b) => b === params || (b != null && b <= params));
|
|
213
|
+
export const $gt = numericalOperation((params) => (b) => b != null && b > params);
|
|
214
|
+
export const $gte = numericalOperation((params) => (b) => b === params || (b != null && b >= params));
|
|
215
|
+
export const $mod = (modParams, owneryQuery, options) => {
|
|
216
|
+
const [mod, equalsValue] = modParams;
|
|
217
|
+
return new EqualsOperation(
|
|
218
|
+
// EqualsOperation accepts a Tester; cast retains that contract.
|
|
219
|
+
((b) => comparable(b) % mod === equalsValue), owneryQuery, options);
|
|
220
|
+
};
|
|
221
|
+
export const $exists = (params, owneryQuery, options, name) => new $Exists(params, owneryQuery, options, name);
|
|
222
|
+
export const $regex = (pattern, owneryQuery, options) => new EqualsOperation(new RegExp(pattern, owneryQuery.$options), owneryQuery, options);
|
|
223
|
+
export const $not = (params, owneryQuery, options, name) => new $Not(params, owneryQuery, options, name);
|
|
224
|
+
const typeAliases = {
|
|
225
|
+
number: (v) => typeof v === "number",
|
|
226
|
+
string: (v) => typeof v === "string",
|
|
227
|
+
bool: (v) => typeof v === "boolean",
|
|
228
|
+
array: (v) => Array.isArray(v),
|
|
229
|
+
null: (v) => v === null,
|
|
230
|
+
timestamp: (v) => v instanceof Date,
|
|
231
|
+
};
|
|
232
|
+
export const $type = (
|
|
233
|
+
// deno-lint-ignore ban-types
|
|
234
|
+
clazz, owneryQuery, options) => new EqualsOperation(
|
|
235
|
+
// EqualsOperation accepts a Tester; cast retains that contract.
|
|
236
|
+
((b) => {
|
|
237
|
+
if (typeof clazz === "string") {
|
|
238
|
+
const alias = typeAliases[clazz];
|
|
239
|
+
if (!alias) {
|
|
240
|
+
throw new Error(`Type alias does not exist`);
|
|
241
|
+
}
|
|
242
|
+
return alias(b);
|
|
243
|
+
}
|
|
244
|
+
return b != null
|
|
245
|
+
? b instanceof clazz ||
|
|
246
|
+
b.constructor === clazz
|
|
247
|
+
: false;
|
|
248
|
+
}), owneryQuery, options);
|
|
249
|
+
export const $and = (params, ownerQuery, options, name) => new $And(params, ownerQuery, options, name);
|
|
250
|
+
export const $all = (params, ownerQuery, options, name) => new $All(params, ownerQuery, options, name);
|
|
251
|
+
export const $size = (params, ownerQuery, options) => new $Size(params, ownerQuery, options, "$size");
|
|
252
|
+
export const $options = () => null;
|
|
253
|
+
// $where intentionally removed from this fork.
|
|
254
|
+
// Upstream evaluated arbitrary JS via `new Function()`. Forbidden in a permission
|
|
255
|
+
// system whose grants come from the DB — code-execution risk.
|
|
256
|
+
// `validateSpec()` in mongo-query.ts is the second barrier.
|
|
257
|
+
//# sourceMappingURL=operations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"operations.js","sourceRoot":"","sources":["../../sift/operations.ts"],"names":[],"mappings":"AAAA,0EAA0E;AAC1E,kEAAkE;AAElE,OAAO,EACL,aAAa,EACb,iBAAiB,EACjB,oBAAoB,EACpB,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,kBAAkB,GAMnB,MAAM,WAAW,CAAC;AACnB,OAAO,EAAE,UAAU,EAAE,OAAO,EAAY,MAAM,YAAY,CAAC;AAE3D,MAAM,GAAI,SAAQ,aAAsB;IAC7B,MAAM,GAAG,IAAI,CAAC;IAGd,IAAI;QACX,IAAI,CAAC,KAAK,GAAG,YAAY,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;IAC/D,CAAC;IACQ,KAAK;QACZ,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;IACD,IAAI,CAAC,IAAa;QAChB,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,CAAC;YACrB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;CACF;AAED,MAAM,UAAW,SAAQ,aAA6B;IAC3C,MAAM,GAAG,IAAI,CAAC;IAEd,IAAI;QACX,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,OAAO,IAAI,CAAC,MAAM,KAAK,QAAQ,EAAE,CAAC;YACpD,MAAM,IAAI,KAAK,CAAC,gDAAgD,CAAC,CAAC;QACpE,CAAC;QACD,IAAI,CAAC,eAAe,GAAG,oBAAoB,CACzC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;IACQ,KAAK;QACZ,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,IAAa;QAChB,IAAI,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC;YAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;gBACnD,mFAAmF;gBACnF,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;gBAE7B,MAAM,KAAK,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;gBACtB,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,KAAK,EAAE,CAAC,EAAE,IAAI,EAAE,KAAK,CAAC,CAAC;gBACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;YACrD,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;YAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QACpB,CAAC;IACH,CAAC;CACF;AAED,MAAM,IAAK,SAAQ,aAA6B;IACrC,MAAM,GAAG,IAAI,CAAC;IAEd,IAAI;QACX,IAAI,CAAC,eAAe,GAAG,oBAAoB,CACzC,IAAI,CAAC,MAAM,EACX,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,OAAO,CACb,CAAC;IACJ,CAAC;IACQ,KAAK;QACZ,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,eAAe,CAAC,KAAK,EAAE,CAAC;IAC/B,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe,EAAE,IAAc;QAC5D,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,CAAC,CAAC;QAClD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;QACtC,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,eAAe,CAAC,IAAI,CAAC;IACzC,CAAC;CACF;AAED,MAAM,OAAO,KAAM,SAAQ,aAAqB;IACrC,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CAAC,IAAa;QAChB,IAAI,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,KAAK,IAAI,CAAC,MAAM,EAAE,CAAC;YACjD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,mBAAmB,GAAG,CAAC,MAAiB,EAAQ,EAAE;IACtD,IAAI,MAAM,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACxB,MAAM,IAAI,KAAK,CAAC,wCAAwC,CAAC,CAAC;IAC5D,CAAC;AACH,CAAC,CAAC;AAEF,MAAM,GAAI,SAAQ,aAA+B;IACtC,MAAM,GAAG,KAAK,CAAC;IAEf,IAAI;QACX,mBAAmB,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACjC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC,EAAE,EAAE,EAAE,CACjC,oBAAoB,CAAC,EAAE,EAAE,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,CAC7C,CAAC;IACJ,CAAC;IACQ,KAAK;QACZ,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,KAAK,EAAE,CAAC;QACvB,CAAC;IACH,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe;QAC5C,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACxD,MAAM,EAAE,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;YACxB,EAAE,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;YAC1B,IAAI,EAAE,CAAC,IAAI,EAAE,CAAC;gBACZ,IAAI,GAAG,IAAI,CAAC;gBACZ,OAAO,GAAG,EAAE,CAAC,IAAI,CAAC;gBAClB,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,IAAK,SAAQ,GAAG;IACF,MAAM,GAAG,KAAK,CAAC;IACxB,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe;QACrD,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAC7B,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC;IACzB,CAAC;CACF;AAED,MAAM,GAAI,SAAQ,aAAsB;IAC7B,MAAM,GAAG,IAAI,CAAC;IAEd,IAAI;QACX,MAAM,MAAM,GAAG,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACxE,IAAI,CAAC,QAAQ,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC,KAAc,EAAE,EAAE;YAC5C,IAAI,iBAAiB,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,EAAE,CAAC;gBAC3C,MAAM,IAAI,KAAK,CACb,uBAAuB,CAAC,IAAI,CAAC,IAAI,IAAI,EAAE,CAAC,CAAC,WAAW,EAAE,EAAE,CACzD,CAAC;YACJ,CAAC;YACD,OAAO,YAAY,CAAC,KAAK,EAAE,IAAI,CAAC,OAAO,CAAC,OAAO,CAAC,CAAC;QACnD,CAAC,CAAC,CAAC;IACL,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,IAAU,EAAE,MAAgB;QAC9C,IAAI,IAAI,GAAG,KAAK,CAAC;QACjB,IAAI,OAAO,GAAG,KAAK,CAAC;QACpB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,EAAE,MAAM,EAAE,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC,GAAG,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YAC5D,MAAM,IAAI,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;YAC9B,IAAI,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;gBACf,IAAI,GAAG,IAAI,CAAC;gBACZ,OAAO,GAAG,IAAI,CAAC;gBACf,MAAM;YACR,CAAC;QACH,CAAC;QAED,IAAI,CAAC,IAAI,GAAG,OAAO,CAAC;QACpB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACnB,CAAC;CACF;AAED,MAAM,IAAK,SAAQ,aAAsB;IAC9B,MAAM,GAAG,IAAI,CAAC;IACf,GAAG,CAAM;IACjB,YACE,MAAe,EACf,UAAmB,EACnB,OAAgB,EAChB,IAAY;QAEZ,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;QACzC,IAAI,CAAC,GAAG,GAAG,IAAI,GAAG,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;IACxD,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe,EAAE,IAAc;QAC5D,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,CAAC,CAAC;QAEhC,IAAI,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAC5B,IAAI,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC;gBAClB,IAAI,CAAC,IAAI,GAAG,KAAK,CAAC;gBAClB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC;iBAAM,IAAI,GAAG,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACnB,CAAC;QACH,CAAC;aAAM,CAAC;YACN,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,CAAC;YAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;IACQ,KAAK;QACZ,KAAK,CAAC,KAAK,EAAE,CAAC;QACd,IAAI,CAAC,GAAG,CAAC,KAAK,EAAE,CAAC;IACnB,CAAC;CACF;AAED,MAAM,OAAQ,SAAQ,aAAsB;IACjC,MAAM,GAAG,IAAI,CAAC;IACvB,IAAI,CACF,KAAc,EACd,GAAS,EACT,KAAe,EACf,KAAe,EACf,IAAc;QAEd,IAAI,CAAC,IAAI,EAAE,CAAC;YACV,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,CAAC,IAAI,CAAC,MAAM,CAAC;QAC3B,CAAC;aAAM,IACL,KAAK,IAAI,IAAI;YACb,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,KAAK,EAAE,GAAkB,CAAC;gBAC7D,IAAI,CAAC,MAAM,EACb,CAAC;YACD,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;YACjB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACnB,CAAC;IACH,CAAC;CACF;AAED,MAAM,IAAK,SAAQ,mBAAmB;IAC3B,MAAM,GAAG,KAAK,CAAC;IACxB,YACE,MAAwB,EACxB,WAA2B,EAC3B,OAAgB,EAChB,IAAY;QAEZ,KAAK,CACH,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,EACxE,IAAI,CACL,CAAC;QAEF,mBAAmB,CAAC,MAAM,CAAC,CAAC;IAC9B,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe,EAAE,IAAc;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,IAAK,SAAQ,mBAAmB;IAC3B,MAAM,GAAG,IAAI,CAAC;IACvB,YACE,MAAwB,EACxB,WAA2B,EAC3B,OAAgB,EAChB,IAAY;QAEZ,KAAK,CACH,MAAM,EACN,WAAW,EACX,OAAO,EACP,MAAM,CAAC,GAAG,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,oBAAoB,CAAC,KAAK,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC,EACxE,IAAI,CACL,CAAC;IACJ,CAAC;IACD,IAAI,CAAC,IAAa,EAAE,GAAS,EAAE,KAAe,EAAE,IAAc;QAC5D,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,EAAE,KAAK,EAAE,IAAI,IAAI,KAAK,CAAC,CAAC;IACrD,CAAC;CACF;AAED,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EACU,EAAE,CAC5B,IAAI,eAAe,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACP,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,MAAwB,EACxB,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACP,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,MAAwB,EACxB,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACN,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,UAAU,GAAG,CACxB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACA,EAAE,CACd,IAAI,UAAU,CAAC,MAAwB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvE,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACN,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAExD,MAAM,CAAC,MAAM,GAAG,GAAG,CACjB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACP,EAAE,CAAC,IAAI,GAAG,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEtD,MAAM,CAAC,MAAM,GAAG,GAAG,kBAAkB,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAK,CAAY,GAAI,MAAiB,CACnE,CAAC;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,IAAK,CAAY,IAAK,MAAiB,CAAC,CACrE,CAAC;AACF,MAAM,CAAC,MAAM,GAAG,GAAG,kBAAkB,CACnC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,IAAI,IAAI,IAAK,CAAY,GAAI,MAAiB,CACnE,CAAC;AACF,MAAM,CAAC,MAAM,IAAI,GAAG,kBAAkB,CACpC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,CAChB,CAAC,KAAK,MAAM,IAAI,CAAC,CAAC,IAAI,IAAI,IAAK,CAAY,IAAK,MAAiB,CAAC,CACrE,CAAC;AAEF,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,SAAmB,EACnB,WAA2B,EAC3B,OAAgB,EACU,EAAE;IAC5B,MAAM,CAAC,GAAG,EAAE,WAAW,CAAC,GAAG,SAAS,CAAC;IACrC,OAAO,IAAI,eAAe;IACxB,gEAAgE;IAChE,CAAC,CAAC,CAAU,EAAE,EAAE,CACb,UAAU,CAAC,CAAC,CAAY,GAAG,GAAG,KAAK,WAAW,CAAY,EAC7D,WAAW,EACX,OAAO,CACR,CAAC;AACJ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,OAAO,GAAG,CACrB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACH,EAAE,CAAC,IAAI,OAAO,CAAC,MAAM,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAE9D,MAAM,CAAC,MAAM,MAAM,GAAG,CACpB,OAAe,EACf,WAA2B,EAC3B,OAAgB,EACS,EAAE,CAC3B,IAAI,eAAe,CACjB,IAAI,MAAM,CAAC,OAAO,EAAG,WAAqC,CAAC,QAAQ,CAAC,EACpE,WAAW,EACX,OAAO,CACR,CAAC;AAEJ,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,MAAe,EACf,WAA2B,EAC3B,OAAgB,EAChB,IAAY,EACN,EAAE,CAAC,IAAI,IAAI,CAAC,MAAwB,EAAE,WAAW,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAE1E,MAAM,WAAW,GAA4C;IAC3D,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;IACpC,MAAM,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,QAAQ;IACpC,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,OAAO,CAAC,KAAK,SAAS;IACnC,KAAK,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;IAC9B,IAAI,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,KAAK,IAAI;IACvB,SAAS,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,YAAY,IAAI;CACpC,CAAC;AAEF,MAAM,CAAC,MAAM,KAAK,GAAG;AACnB,6BAA6B;AAC7B,KAAwB,EACxB,WAA2B,EAC3B,OAAgB,EACU,EAAE,CAC5B,IAAI,eAAe;AACjB,gEAAgE;AAChE,CAAC,CAAC,CAAU,EAAE,EAAE;IACd,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QAC9B,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,CAAC,CAAC;QACjC,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;QAC/C,CAAC;QACD,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;IAClB,CAAC;IACD,OAAO,CAAC,IAAI,IAAI;QACd,CAAC,CAAC,CAAC,YAAa,KAA6C;YACxD,CAA+B,CAAC,WAAW,KAAK,KAAK;QAC1D,CAAC,CAAC,KAAK,CAAC;AACZ,CAAC,CAAY,EACb,WAAW,EACX,OAAO,CACR,CAAC;AAEJ,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,MAAwB,EACxB,UAA0B,EAC1B,OAAgB,EAChB,IAAY,EACN,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,IAAI,GAAG,CAClB,MAAwB,EACxB,UAA0B,EAC1B,OAAgB,EAChB,IAAY,EACN,EAAE,CAAC,IAAI,IAAI,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC;AAEvD,MAAM,CAAC,MAAM,KAAK,GAAG,CACnB,MAAc,EACd,UAA0B,EAC1B,OAAgB,EACT,EAAE,CAAC,IAAI,KAAK,CAAC,MAAM,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,CAAC,CAAC;AAE5D,MAAM,CAAC,MAAM,QAAQ,GAAG,GAAS,EAAE,CAAC,IAAI,CAAC;AAEzC,+CAA+C;AAC/C,kFAAkF;AAClF,8DAA8D;AAC9D,4DAA4D"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type Key = string | number;
|
|
2
|
+
export type Comparator = (a: unknown, b: unknown) => boolean;
|
|
3
|
+
export declare const typeChecker: <TType>(type: string) => (value: unknown) => value is TType;
|
|
4
|
+
export declare const comparable: (value: unknown) => unknown;
|
|
5
|
+
export declare const coercePotentiallyNull: (value: unknown) => unknown;
|
|
6
|
+
export declare const isArray: (value: unknown) => value is unknown[];
|
|
7
|
+
export declare const isObject: (value: unknown) => value is Object;
|
|
8
|
+
export declare const isFunction: (value: unknown) => value is Function;
|
|
9
|
+
export declare const isProperty: (item: object, key: PropertyKey) => boolean;
|
|
10
|
+
export declare const isVanillaObject: (value: unknown) => boolean;
|
|
11
|
+
export declare const equals: (a: unknown, b: unknown) => boolean;
|
|
12
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../sift/utils.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,GAAG,GAAG,MAAM,GAAG,MAAM,CAAC;AAClC,MAAM,MAAM,UAAU,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,CAAC,EAAE,OAAO,KAAK,OAAO,CAAC;AAE7D,eAAO,MAAM,WAAW,GAAI,KAAK,EAAE,MAAM,MAAM,MAE5B,OAAO,OAAO,KAAG,KAAK,IAAI,KAG5C,CAAC;AAKF,eAAO,MAAM,UAAU,GAAI,OAAO,OAAO,KAAG,OAa3C,CAAC;AAEF,eAAO,MAAM,qBAAqB,GAAI,OAAO,OAAO,KAAG,OACzB,CAAC;AAE/B,eAAO,MAAM,OAAO,UA1BM,OAAO,KAAG,KAAK,aA0Ba,CAAC;AAEvD,eAAO,MAAM,QAAQ,UA5BK,OAAO,KAAG,KAAK,UA4BY,CAAC;AAEtD,eAAO,MAAM,UAAU,UA9BG,OAAO,KAAG,KAAK,YA8BkB,CAAC;AAE5D,eAAO,MAAM,UAAU,GAAI,MAAM,MAAM,EAAE,KAAK,WAAW,KAAG,OAK3D,CAAC;AAEF,eAAO,MAAM,eAAe,GAAI,OAAO,OAAO,KAAG,OAahD,CAAC;AAEF,eAAO,MAAM,MAAM,GAAI,GAAG,OAAO,EAAE,GAAG,OAAO,KAAG,OAiC/C,CAAC"}
|
|
@@ -0,0 +1,80 @@
|
|
|
1
|
+
// Vendored from sift.js (https://github.com/crcn/sift.js) — MIT licensed.
|
|
2
|
+
// `$where` operator removed (security: arbitrary code execution).
|
|
3
|
+
export const typeChecker = (type) => {
|
|
4
|
+
const typeString = "[object " + type + "]";
|
|
5
|
+
return function (value) {
|
|
6
|
+
return getClassName(value) === typeString;
|
|
7
|
+
};
|
|
8
|
+
};
|
|
9
|
+
const getClassName = (value) => Object.prototype.toString.call(value);
|
|
10
|
+
export const comparable = (value) => {
|
|
11
|
+
if (value instanceof Date) {
|
|
12
|
+
return value.getTime();
|
|
13
|
+
}
|
|
14
|
+
else if (isArray(value)) {
|
|
15
|
+
return value.map(comparable);
|
|
16
|
+
}
|
|
17
|
+
else if (value != null &&
|
|
18
|
+
typeof value.toJSON === "function") {
|
|
19
|
+
return value.toJSON();
|
|
20
|
+
}
|
|
21
|
+
return value;
|
|
22
|
+
};
|
|
23
|
+
export const coercePotentiallyNull = (value) => value == null ? null : value;
|
|
24
|
+
export const isArray = typeChecker("Array");
|
|
25
|
+
// deno-lint-ignore ban-types
|
|
26
|
+
export const isObject = typeChecker("Object");
|
|
27
|
+
// deno-lint-ignore ban-types
|
|
28
|
+
export const isFunction = typeChecker("Function");
|
|
29
|
+
export const isProperty = (item, key) => {
|
|
30
|
+
return (Object.prototype.hasOwnProperty.call(item, key) &&
|
|
31
|
+
!isFunction(item[key]));
|
|
32
|
+
};
|
|
33
|
+
export const isVanillaObject = (value) => {
|
|
34
|
+
if (value == null || typeof value !== "object")
|
|
35
|
+
return false;
|
|
36
|
+
const ctor = value.constructor;
|
|
37
|
+
if (!ctor)
|
|
38
|
+
return false;
|
|
39
|
+
return ((ctor === Object ||
|
|
40
|
+
ctor === Array ||
|
|
41
|
+
ctor.toString() === "function Object() { [native code] }" ||
|
|
42
|
+
ctor.toString() === "function Array() { [native code] }") &&
|
|
43
|
+
!value.toJSON);
|
|
44
|
+
};
|
|
45
|
+
export const equals = (a, b) => {
|
|
46
|
+
if (a == null && a == b) {
|
|
47
|
+
return true;
|
|
48
|
+
}
|
|
49
|
+
if (a === b) {
|
|
50
|
+
return true;
|
|
51
|
+
}
|
|
52
|
+
if (Object.prototype.toString.call(a) !== Object.prototype.toString.call(b)) {
|
|
53
|
+
return false;
|
|
54
|
+
}
|
|
55
|
+
if (isArray(a)) {
|
|
56
|
+
const arrB = b;
|
|
57
|
+
if (a.length !== arrB.length) {
|
|
58
|
+
return false;
|
|
59
|
+
}
|
|
60
|
+
for (let i = 0, { length } = a; i < length; i++) {
|
|
61
|
+
if (!equals(a[i], arrB[i]))
|
|
62
|
+
return false;
|
|
63
|
+
}
|
|
64
|
+
return true;
|
|
65
|
+
}
|
|
66
|
+
else if (isObject(a)) {
|
|
67
|
+
const objA = a;
|
|
68
|
+
const objB = b;
|
|
69
|
+
if (Object.keys(objA).length !== Object.keys(objB).length) {
|
|
70
|
+
return false;
|
|
71
|
+
}
|
|
72
|
+
for (const key in objA) {
|
|
73
|
+
if (!equals(objA[key], objB[key]))
|
|
74
|
+
return false;
|
|
75
|
+
}
|
|
76
|
+
return true;
|
|
77
|
+
}
|
|
78
|
+
return false;
|
|
79
|
+
};
|
|
80
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../sift/utils.ts"],"names":[],"mappings":"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"}
|
package/dist/system.d.ts
ADDED
|
@@ -0,0 +1,113 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Moteur d'orchestration resource-pipe.
|
|
3
|
+
*
|
|
4
|
+
* Responsabilités :
|
|
5
|
+
* - Maintenir un cache `(resource.id, dedupKey) → Promise<T>` par context()
|
|
6
|
+
* - Filtrer les rules actives (activeWhen) avant de fetcher leurs needs
|
|
7
|
+
* - Lancer les fetches en parallèle (Promise.all) avec dedup
|
|
8
|
+
* - Évaluer les rules d'un grant en série (préserve l'ordre des reasons)
|
|
9
|
+
* - OR sémantique entre grants : un grant qui passe = `ok: true`
|
|
10
|
+
* - Validation d'arity du target au boot et au check
|
|
11
|
+
*
|
|
12
|
+
* Cf. RFC §"Sémantique d'exécution".
|
|
13
|
+
*/
|
|
14
|
+
import type { CanResult, Grant, IndirectResourceInfo, ListEntry, Permission, Resource, Subject, TreeNode } from "./types.ts";
|
|
15
|
+
import { type IndirectResource } from "./indirect-resource.ts";
|
|
16
|
+
export type ProviderFn = (subject: Subject, key: string, target?: readonly unknown[]) => readonly Grant[] | Promise<readonly Grant[]>;
|
|
17
|
+
/**
|
|
18
|
+
* Provider sous forme objet : permet d'opt-in à la dedup de grants
|
|
19
|
+
* (cacheKey) et au filtrage par préfixe de key (keys/matches).
|
|
20
|
+
*
|
|
21
|
+
* - `keys`/`matches` : le provider est skip si la key demandée ne match pas
|
|
22
|
+
* - `cacheKey` : grants memoizés par (subject, key, target) au sein d'un context
|
|
23
|
+
*/
|
|
24
|
+
export type ProviderObject = {
|
|
25
|
+
readonly keys?: readonly string[];
|
|
26
|
+
readonly matches?: (key: string) => boolean;
|
|
27
|
+
readonly cacheKey?: (subject: Subject, key: string, target?: readonly unknown[]) => string;
|
|
28
|
+
readonly fetch: ProviderFn;
|
|
29
|
+
};
|
|
30
|
+
export type Provider = ProviderFn | ProviderObject;
|
|
31
|
+
export type CanContext = {
|
|
32
|
+
readonly checkDate?: Date;
|
|
33
|
+
readonly checkIp?: string;
|
|
34
|
+
/** True : le target peut contenir des wildcards et matche les grants overlap. */
|
|
35
|
+
readonly broadMatch?: boolean;
|
|
36
|
+
/**
|
|
37
|
+
* Check-time payload exposed to rules as `ctx.input`. Distinct from
|
|
38
|
+
* `grant.payload` (static, seed-time). Consumed by `inputMatch()` to
|
|
39
|
+
* validate a CREATE body against `grant.with`.
|
|
40
|
+
*/
|
|
41
|
+
readonly input?: unknown;
|
|
42
|
+
};
|
|
43
|
+
export type System<TMeta = unknown> = {
|
|
44
|
+
list(): readonly ListEntry<TMeta>[];
|
|
45
|
+
tree(): {
|
|
46
|
+
readonly children: Readonly<Record<string, TreeNode<TMeta>>>;
|
|
47
|
+
};
|
|
48
|
+
schema(key: string): Permission<TMeta> | undefined;
|
|
49
|
+
/**
|
|
50
|
+
* Every distinct indirect resource referenced by the schema's rules,
|
|
51
|
+
* deduped by id. Returned in declaration-walk order (first-occurrence
|
|
52
|
+
* wins for dedup). Function fields are stripped — see
|
|
53
|
+
* `IndirectResourceInfo`. Empty if no permission uses `.match()` on an
|
|
54
|
+
* `indirectResource`.
|
|
55
|
+
*/
|
|
56
|
+
indirectResources(): readonly IndirectResourceInfo[];
|
|
57
|
+
/**
|
|
58
|
+
* Indirect resources referenced by a single permission's rules.
|
|
59
|
+
* `[]` if `key` is unknown or has no `indirect-match` rule. Useful so
|
|
60
|
+
* matrix UIs only render the indirect-match editor on permissions where
|
|
61
|
+
* it has a semantic.
|
|
62
|
+
*/
|
|
63
|
+
indirectsUsedBy(key: string): readonly IndirectResourceInfo[];
|
|
64
|
+
/** Check direct (sans cache cross-can) — préfère `context()` en HTTP. */
|
|
65
|
+
can(subject: Subject, key: string, target?: readonly unknown[], context?: CanContext): Promise<CanResult>;
|
|
66
|
+
/**
|
|
67
|
+
* Crée un context request-scoped avec cache de fetches partagé entre
|
|
68
|
+
* tous les `can()` qui en découlent.
|
|
69
|
+
*/
|
|
70
|
+
context(bound: {
|
|
71
|
+
readonly subject: Subject;
|
|
72
|
+
} & CanContext): {
|
|
73
|
+
/**
|
|
74
|
+
* `perCall` overrides the bound `CanContext` for this single check.
|
|
75
|
+
* Canonical use : passing `input` for a CREATE while keeping the
|
|
76
|
+
* shared (per-request) context. Other fields stay bound — override
|
|
77
|
+
* only when truly per-call.
|
|
78
|
+
*/
|
|
79
|
+
can(key: string, target?: readonly unknown[], perCall?: CanContext): Promise<CanResult>;
|
|
80
|
+
/**
|
|
81
|
+
* Inject pre-loaded docs into the resource cache so subsequent
|
|
82
|
+
* `can()` calls skip the fetch. Typical use : after a paginated
|
|
83
|
+
* list, the caller has all docs in memory — pre-seed them so the
|
|
84
|
+
* per-doc projection check doesn't hit the DB again.
|
|
85
|
+
*
|
|
86
|
+
* `dedupKey(doc)` MUST return the same target segments the resource's
|
|
87
|
+
* `dedupKey` would compute at fetch time — otherwise the cache key
|
|
88
|
+
* won't match and the preseed is silently ineffective. For most
|
|
89
|
+
* resources whose dedupKey is `target[i]`, just return `[doc._id]`
|
|
90
|
+
* (or the relevant segments).
|
|
91
|
+
*
|
|
92
|
+
* `value(doc)` is optional. Defaults to identity (the doc itself,
|
|
93
|
+
* used for direct resources). Provide it for indirect resources
|
|
94
|
+
* where the cached value is an array of joined docs nested under
|
|
95
|
+
* an alias (e.g. `d => d._memberships_of_participant`).
|
|
96
|
+
*/
|
|
97
|
+
preseed<T, V = T>(resource: Resource<unknown> | IndirectResource | string, docs: ReadonlyArray<T>, opts: {
|
|
98
|
+
dedupKey: (doc: T) => readonly unknown[];
|
|
99
|
+
value?: (doc: T) => V;
|
|
100
|
+
}): void;
|
|
101
|
+
/** Compteurs de fetches par resource.id (debug / observabilité). */
|
|
102
|
+
getFetchCounters(): Readonly<Record<string, number>>;
|
|
103
|
+
/** Reset des compteurs (pas du cache). */
|
|
104
|
+
clearCounters(): void;
|
|
105
|
+
/** Dump des grants émis dans ce context (debug). */
|
|
106
|
+
dumpGrants(): Promise<readonly Grant[]>;
|
|
107
|
+
};
|
|
108
|
+
};
|
|
109
|
+
export declare function createSystem<TMeta = unknown>(opts: {
|
|
110
|
+
readonly schema: Readonly<Record<string, Permission<TMeta>>>;
|
|
111
|
+
readonly providers?: readonly Provider[];
|
|
112
|
+
}): System<TMeta>;
|
|
113
|
+
//# sourceMappingURL=system.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"system.d.ts","sourceRoot":"","sources":["../system.ts"],"names":[],"mappings":"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"}
|