@liquisio/wix-access 0.4.0 → 0.5.1
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 +57 -1
- package/backend.d.ts +62 -8
- package/backend.js +2 -2
- package/package.json +30 -8
- package/public.js +2 -2
- package/types.d.ts +6 -1
package/README.md
CHANGED
|
@@ -156,6 +156,45 @@ const result = await db.get('Bookings', id, { principal }) // opaque
|
|
|
156
156
|
await db.insert('Bookings', row, { principal, action: 'create' }) // stamps the owner field
|
|
157
157
|
```
|
|
158
158
|
|
|
159
|
+
**Creating a row for someone else.** An admin taking a phone booking, staff booking a
|
|
160
|
+
walk-in, a guest matched to an account by email. Wix cannot do this with `_owner` — an
|
|
161
|
+
elevated write stores `null`, and setting `_owner` explicitly does not stick — so the
|
|
162
|
+
gateway does it with the declared fields:
|
|
163
|
+
|
|
164
|
+
```js
|
|
165
|
+
// policy.collections
|
|
166
|
+
Bookings: { resource: 'Booking', owner: 'customerId', actor: 'createdBy', tenant: 'vendor' }
|
|
167
|
+
|
|
168
|
+
// policy.rules — who may put a row in another member's name. `manage` already covers it.
|
|
169
|
+
{ subject: 'vendorStaff', actions: 'assignOwner', resource: 'Booking',
|
|
170
|
+
where: { vendor: { $in: '$principal.domain.vendorIds' } } }
|
|
171
|
+
```
|
|
172
|
+
|
|
173
|
+
```js
|
|
174
|
+
// staff or admin, checked against assignOwner
|
|
175
|
+
await db.insert('Bookings', row, { principal, onBehalfOf: customerMemberId })
|
|
176
|
+
|
|
177
|
+
// the server decided the owner itself; the caller (a visitor) holds no assignOwner
|
|
178
|
+
await db.insert('Bookings', row, { principal, onBehalfOf: matchedMemberId, system: true })
|
|
179
|
+
|
|
180
|
+
// re-own an existing row, or detach it with null
|
|
181
|
+
await db.transfer('Bookings', bookingId, rightMemberId, { principal })
|
|
182
|
+
```
|
|
183
|
+
|
|
184
|
+
- The owner is **never read from the record.** It is the caller's member id (`null` for a
|
|
185
|
+
visitor) unless `onBehalfOf` says otherwise, and only server code can pass that option.
|
|
186
|
+
- `actor` records who really created the row. It is stamped on insert and never changes.
|
|
187
|
+
- **Namespaced collections.** An installed Blocks app addresses its collections as
|
|
188
|
+
`@scope/app/Bookings` (WIXA-014). Key the policy by the bare name and pass
|
|
189
|
+
`createAccess(policy, { namespace: '@scope/app/' })`; the gateway tries the exact id
|
|
190
|
+
first, then the id without the namespace. Without the option a namespaced id finds no
|
|
191
|
+
policy entry, so nothing is stamped and every rule misses — every write is refused.
|
|
192
|
+
- `update` keeps both fields as stored and refuses `onBehalfOf`; ownership moves only by
|
|
193
|
+
`transfer`, which checks `assignOwner` against the row before and after the move.
|
|
194
|
+
- Every delegated insert and every transfer reaches the `audit` sink as `access.onBehalf`
|
|
195
|
+
or `access.transfer`, `system` ones included. An audit sink that throws does not fail
|
|
196
|
+
the write — it goes to `onError('audit', error)` instead.
|
|
197
|
+
|
|
159
198
|
**Page code** — the same rules, so the UI agrees with the server.
|
|
160
199
|
|
|
161
200
|
```js
|
|
@@ -188,6 +227,18 @@ $w.onReady(async () => {
|
|
|
188
227
|
|
|
189
228
|
Each is measured, and each will bite otherwise.
|
|
190
229
|
|
|
230
|
+
- **The platform gate runs BEFORE any of your code.** Wix reads the method's
|
|
231
|
+
`permission` and refuses first; your handler, and therefore `guard`, never run
|
|
232
|
+
for a caller who fails it. Measured: a method gated `Admin` returned the
|
|
233
|
+
platform's opaque `NotAuthorizedError` to a plain member, not the package's
|
|
234
|
+
refusal envelope. So `guard`'s own level check is a **second** line, not the
|
|
235
|
+
first — it matters when the platform gate is looser than the policy, or when
|
|
236
|
+
`applyGates` was never called.
|
|
237
|
+
- **Which means level failures are opaque and ownership failures are not.** A
|
|
238
|
+
caller refused by the platform gets a generic error with no reason. A caller
|
|
239
|
+
who passes the gate but fails an ownership or ability check reaches your code
|
|
240
|
+
and gets a refusal envelope with a code. That is the right split: coarse
|
|
241
|
+
refusals need no explanation, and the ones that do are the ones you can reach.
|
|
191
242
|
- **Refusals are returned, never thrown.** A thrown backend error reaches the
|
|
192
243
|
browser as "Unable to handle the request" with the reason discarded. Check
|
|
193
244
|
`result.ok`.
|
|
@@ -195,7 +246,12 @@ Each is measured, and each will bite otherwise.
|
|
|
195
246
|
the same code, so refusals cannot be used to enumerate ids.
|
|
196
247
|
- **`_owner` is unusable.** Every elevated write stores `_owner: null`, and the
|
|
197
248
|
app must write elevated. Declare `owner` on the collection and the gateway
|
|
198
|
-
stamps it explicitly.
|
|
249
|
+
stamps it explicitly. Nor can an admin set `_owner` to another member by
|
|
250
|
+
passing it; create on someone's behalf with `onBehalfOf` instead.
|
|
251
|
+
- **Since 0.5.0 an owner value inside the record is ignored**, for visitors too.
|
|
252
|
+
0.4.0 kept it when the caller had no member id, which let a visitor file a row
|
|
253
|
+
under any member. Code that relied on that passes `onBehalfOf` (with
|
|
254
|
+
`system: true` when the server chose the owner).
|
|
199
255
|
- **`update` is checked against the stored row**, never the submitted one, so a
|
|
200
256
|
caller cannot authorise themselves by sending an owner field they do not own.
|
|
201
257
|
- **"Could not verify" is not "not allowed".** A failed roles read or enricher
|
package/backend.d.ts
CHANGED
|
@@ -1,13 +1,35 @@
|
|
|
1
1
|
export * from './types'
|
|
2
2
|
import { Policy, Principal, Ability, SerialisedRule, Result, Clause, Scope } from './types'
|
|
3
3
|
|
|
4
|
-
export
|
|
5
|
-
|
|
6
|
-
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
4
|
+
export type AuditEvent =
|
|
5
|
+
| {
|
|
6
|
+
event: 'access.denied'
|
|
7
|
+
action: string
|
|
8
|
+
code: string
|
|
9
|
+
caller: string | null
|
|
10
|
+
detail?: unknown
|
|
11
|
+
}
|
|
12
|
+
| {
|
|
13
|
+
/** A row was created in someone else's name. */
|
|
14
|
+
event: 'access.onBehalf'
|
|
15
|
+
action: string
|
|
16
|
+
caller: string | null
|
|
17
|
+
owner: string
|
|
18
|
+
system: boolean
|
|
19
|
+
collection: string
|
|
20
|
+
id: string
|
|
21
|
+
}
|
|
22
|
+
| {
|
|
23
|
+
/** A row moved from one owner to another. */
|
|
24
|
+
event: 'access.transfer'
|
|
25
|
+
action: 'assignOwner'
|
|
26
|
+
caller: string | null
|
|
27
|
+
from: string | null
|
|
28
|
+
owner: string | null
|
|
29
|
+
system: boolean
|
|
30
|
+
collection: string
|
|
31
|
+
id: string
|
|
32
|
+
}
|
|
11
33
|
|
|
12
34
|
export interface CreateAccessOptions {
|
|
13
35
|
/** Adds domain facts to the Principal — vendor membership, tenancy, staff rows. */
|
|
@@ -16,6 +38,12 @@ export interface CreateAccessOptions {
|
|
|
16
38
|
audit?: (event: AuditEvent) => void
|
|
17
39
|
/** Called when identity resolution or a guard fails internally. */
|
|
18
40
|
onError?: (stage: string, error: unknown) => void
|
|
41
|
+
/**
|
|
42
|
+
* The app's collection namespace, e.g. `'@scope/app/'`. With it, the gateway finds a
|
|
43
|
+
* namespaced id (`@scope/app/Bookings`) under its bare policy key (`Bookings`). An
|
|
44
|
+
* exact key still wins. Without it, a namespaced id matches only a namespaced key.
|
|
45
|
+
*/
|
|
46
|
+
namespace?: string
|
|
19
47
|
/** Override the injected Wix modules. Tests only. */
|
|
20
48
|
deps?: Record<string, unknown>
|
|
21
49
|
}
|
|
@@ -33,11 +61,37 @@ export interface DbOptions {
|
|
|
33
61
|
limit?: number
|
|
34
62
|
}
|
|
35
63
|
|
|
64
|
+
export interface InsertOptions extends DbOptions {
|
|
65
|
+
/**
|
|
66
|
+
* Create the row in this member's name instead of the caller's. Needs the `assignOwner`
|
|
67
|
+
* ability against the row, unless `system` is set. Any owner value inside the record
|
|
68
|
+
* itself is always ignored.
|
|
69
|
+
*/
|
|
70
|
+
onBehalfOf?: string
|
|
71
|
+
/**
|
|
72
|
+
* The SERVER worked this owner out (e.g. a guest matched to an account by email), so the
|
|
73
|
+
* caller's `assignOwner` right is not checked. Still audited. Requires `onBehalfOf`.
|
|
74
|
+
*/
|
|
75
|
+
system?: boolean
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
export interface TransferOptions {
|
|
79
|
+
principal: Principal
|
|
80
|
+
/** Skip the `assignOwner` check for a server-decided move. Still audited. */
|
|
81
|
+
system?: boolean
|
|
82
|
+
}
|
|
83
|
+
|
|
84
|
+
/** The action a caller needs to create or move a row in someone else's name. */
|
|
85
|
+
export declare const ASSIGN_OWNER: 'assignOwner'
|
|
86
|
+
|
|
36
87
|
export interface Db {
|
|
37
88
|
query(collection: string, opts: DbOptions): Promise<{ ok: true; data: unknown[]; scope: Scope }>
|
|
38
89
|
get(collection: string, id: string, opts: DbOptions): Promise<Result<unknown>>
|
|
39
|
-
insert(collection: string, record: Record<string, unknown>, opts:
|
|
90
|
+
insert(collection: string, record: Record<string, unknown>, opts: InsertOptions): Promise<Result<unknown>>
|
|
91
|
+
/** Never changes the owner or actor field; refuses `onBehalfOf` — use `transfer`. */
|
|
40
92
|
update(collection: string, id: string, changes: Record<string, unknown>, opts: DbOptions): Promise<Result<unknown>>
|
|
93
|
+
/** Moves a row to another owner, or to none with `null`. */
|
|
94
|
+
transfer(collection: string, id: string, newOwner: string | null, opts: TransferOptions): Promise<Result<unknown>>
|
|
41
95
|
remove(collection: string, id: string, opts: DbOptions): Promise<Result<unknown>>
|
|
42
96
|
}
|
|
43
97
|
|
package/backend.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var Jt=Object.create;var J=Object.defineProperty;var Kt=Object.getOwnPropertyDescriptor;var Zt=Object.getOwnPropertyNames;var Ht=Object.getPrototypeOf,Qt=Object.prototype.hasOwnProperty;var Wt=(t,e)=>{for(var r in e)J(t,r,{get:e[r],enumerable:!0})},st=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of Zt(e))!Qt.call(t,s)&&s!==r&&J(t,s,{get:()=>e[s],enumerable:!(n=Kt(e,s))||n.enumerable});return t};var Xt=(t,e,r)=>(r=t!=null?Jt(Ht(t)):{},st(e||!t||!t.__esModule?J(r,"default",{value:t,enumerable:!0}):r,t)),er=t=>st(J({},"__esModule",{value:!0}),t);var Wr={};Wt(Wr,{CASES:()=>rt,CODES:()=>O,KIND:()=>$,PACKAGE_VERSION:()=>tt,PolicyError:()=>M,SCOPE:()=>v,WHEN:()=>I,abilityFor:()=>ce,abilityFromRules:()=>Qe,anonymous:()=>at,applyClauses:()=>le,applyGates:()=>kt,assertDeclared:()=>Ut,assertGates:()=>Rt,backendMemberId:()=>Qr,backendPing:()=>Hr,can:()=>w,caseTable:()=>Dt,createAccess:()=>Zr,createPrincipal:()=>L,deny:()=>C,denyOpaque:()=>j,filterFor:()=>ue,hasRole:()=>K,isDenial:()=>it,normaliseRoles:()=>fe,ok:()=>ot,parseGates:()=>Xe,permissionFor:()=>ut,resolvePlaceholders:()=>St,resolveSubjects:()=>P,resolveWhere:()=>ae,rulesFor:()=>k,validatePolicy:()=>Z,verifyGates:()=>et});module.exports=er(Wr);var nt=require("wix-members-backend"),Gt=Xt(require("wix-users-backend"),1),zt=require("@wix/data"),Vt=require("@wix/essentials");var O={FORBIDDEN:"FORBIDDEN",UNAUTHENTICATED:"UNAUTHENTICATED",UNVERIFIED:"UNVERIFIED",NOT_FOUND:"NOT_FOUND",INVALID_POLICY:"INVALID_POLICY",INVALID_ARGUMENT:"INVALID_ARGUMENT"},M=class extends Error{constructor(e){super(e),this.name="PolicyError",this.code=O.INVALID_POLICY}};function ot(t){return{ok:!0,data:t===void 0?null:t}}function C(t,e,r){let n={ok:!1,code:t||O.FORBIDDEN};return e&&(n.action=e),r&&(n.detail=r),n}var it=t=>!!t&&t.ok===!1;function j(t){return C(O.NOT_FOUND,t)}var $={VISITOR:"visitor",MEMBER:"member",CAPABILITY:"capability",SERVICE:"service"};function fe(t){if(!Array.isArray(t))return[];let e=[];for(let r of t){if(typeof r=="string"){e.push(r);continue}if(!r||typeof r!="object")continue;let n=r.title||r.name||r.roleKey;n&&e.push(n)}return e}function L(t){let e=t||{},r=e.memberId||null,n=fe(e.roles);return{kind:e.kind||(r?$.MEMBER:$.VISITOR),memberId:r,roles:n,subjects:Array.isArray(e.subjects)?e.subjects.slice():[],domain:e.domain&&typeof e.domain=="object"?e.domain:{},unverified:!!e.unverified}}var at=()=>L({kind:$.VISITOR}),K=(t,e)=>t.roles.indexOf(e)!==-1;var I={ANYONE:"anyone",ANONYMOUS:"anonymous",MEMBER:"member"},E=t=>!!t&&typeof t=="object"&&!Array.isArray(t),tr=t=>Array.isArray(t)?t:[t];function h(t,e){throw new M("policy"+t+": "+e)}function rr(t,e){let r=".subjects."+t;E(e)||h(r,"must be an object");let s=["when","role","domain"].filter(o=>e[o]!==void 0);if(s.length===0&&h(r,'needs exactly one of when/role/domain \u2014 "{}" is ambiguous between a visitor and a member'),s.length>1&&h(r,"has "+s.join(" and ")+"; use exactly one"),e.when!==void 0){let o=[I.ANYONE,I.ANONYMOUS,I.MEMBER];o.indexOf(e.when)===-1&&h(r+".when","must be one of "+o.join(", ")+" (got "+JSON.stringify(e.when)+")")}e.role!==void 0&&typeof e.role!="string"&&h(r+".role","must be a string"),e.domain!==void 0&&typeof e.domain!="string"&&h(r+".domain","must be a string")}function nr(t,e,r){let n=".rules["+e+"]";E(t)||h(n,"must be an object"),typeof t.subject!="string"&&h(n+".subject","must be a string"),r.indexOf(t.subject)===-1&&h(n+".subject",'"'+t.subject+'" is not declared in policy.subjects'),t.actions===void 0&&h(n+".actions","is required");for(let s of tr(t.actions))typeof s!="string"&&h(n+".actions","must be a string or an array of strings");typeof t.resource!="string"&&h(n+".resource","must be a string"),t.where!==void 0&&!E(t.where)&&h(n+".where","must be an object")}var ct=["Anyone","SiteMember","Admin"];function sr(t,e,r){let n=".api."+t;E(e)||h(n,"must be an object"),ct.indexOf(e.permission)===-1&&h(n+".permission","must be one of "+ct.join(", ")+" (got "+JSON.stringify(e.permission)+")"),e.ability!==void 0&&((!Array.isArray(e.ability)||e.ability.length!==2)&&h(n+".ability","must be [action, resource]"),(typeof e.ability[0]!="string"||typeof e.ability[1]!="string")&&h(n+".ability","both entries must be strings")),e.subject!==void 0&&r.indexOf(e.subject)===-1&&h(n+".subject",'"'+e.subject+'" is not declared in policy.subjects')}function Z(t){if(!E(t))throw new M("policy must be an object");E(t.subjects)||h(".subjects","is required and must be an object");let e=Object.keys(t.subjects);e.length===0&&h(".subjects","declares no subjects");for(let r of e)rr(r,t.subjects[r]);if(Array.isArray(t.rules)||h(".rules","is required and must be an array"),t.rules.forEach((r,n)=>nr(r,n,e)),t.api!==void 0){E(t.api)||h(".api","must be an object");for(let r of Object.keys(t.api))sr(r,t.api[r],e)}return t.collections!==void 0&&!E(t.collections)&&h(".collections","must be an object"),t}function P(t,e){let r=new Set(t.subjects||[]);for(let n of Object.keys(e.subjects)){let s=e.subjects[n];(s.when===I.ANYONE||s.when===I.ANONYMOUS&&!t.memberId||s.when===I.MEMBER&&t.memberId||s.role!==void 0&&t.roles.indexOf(s.role)!==-1||s.domain!==void 0&&t.domain[s.domain])&&r.add(n)}return Array.from(r)}function ut(t,e){let r=t.api&&t.api[e];return r?r.permission:null}var H=class{constructor(e,r){this.operator=e,this.value=r,Object.defineProperty(this,"t",{writable:!0})}get notes(){return this.t}addNote(e){this.t=this.t||[],this.t.push(e)}},B=class extends H{},S=class extends B{constructor(e,r){if(!Array.isArray(r))throw new Error(`"${e}" operator expects to receive an array of conditions`);super(e,r)}},N="__itself__",_=class extends H{constructor(e,r,n){super(e,n),this.field=r}},me=new B("__null__",null),he=Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);function or(t,e){return e instanceof S&&e.operator===t}function ye(t,e){return e.length===1?e[0]:new S(t,(function r(n,s,o){let i=o||[];for(let a=0,l=s.length;a<l;a++){let u=s[a];or(n,u)?r(n,u.value,i):i.push(u)}return i})(t,e))}var ir=t=>t,lt=()=>Object.create(null),ft=Object.defineProperty(lt(),"__@type@__",{value:"ignore value"});function ar(t,e,r=!1){if(!t||t&&t.constructor!==Object)return!1;for(let n in t)if(he(t,n)&&he(e,n)&&(!r||t[n]!==ft))return!0;return!1}function cr(t){let e=[];for(let r in t)he(t,r)&&t[r]!==ft&&e.push(r);return e}function pe(t,e){e!==me&&t.push(e)}var be=t=>ye("and",t);var Q={compound(t,e,r){let n=(Array.isArray(e)?e:[e]).map(s=>r.parse(s));return new S(t.name,n)},field:(t,e,r)=>new _(t.name,r.field,e),document:(t,e)=>new B(t.name,e)},G=class{constructor(e,r=lt()){this.o=void 0,this.s=void 0,this.i=void 0,this.u=void 0,this.h=void 0,this.parse=this.parse.bind(this),this.u={operatorToConditionName:r.operatorToConditionName||ir,defaultOperatorName:r.defaultOperatorName||"eq",mergeFinalConditions:r.mergeFinalConditions||be},this.o=Object.keys(e).reduce((n,s)=>(n[s]=Object.assign({name:this.u.operatorToConditionName(s)},e[s]),n),{}),this.s=Object.assign({},r.fieldContext,{field:"",query:{},parse:this.parse,hasOperators:n=>ar(n,this.o,r.useIgnoreValue)}),this.i=Object.assign({},r.documentContext,{parse:this.parse,query:{}}),this.h=r.useIgnoreValue?cr:Object.keys}setParse(e){this.parse=e,this.s.parse=e,this.i.parse=e}parseField(e,r,n,s){let o=this.o[r];if(!o)throw new Error(`Unsupported operator "${r}"`);if(o.type!=="field")throw new Error(`Unexpected ${o.type} operator "${r}" at field level`);return this.s.field=e,this.s.query=s,this.parseInstruction(o,n,this.s)}parseInstruction(e,r,n){return typeof e.validate=="function"&&e.validate(e,r),(e.parse||Q[e.type])(e,r,n)}parseFieldOperators(e,r){let n=[],s=this.h(r);for(let o=0,i=s.length;o<i;o++){let a=s[o];if(!this.o[a])throw new Error(`Field query for "${e}" may contain only operators or a plain object as a value`);pe(n,this.parseField(e,a,r[a],r))}return n}parse(e){let r=[],n=this.h(e);this.i.query=e;for(let s=0,o=n.length;s<o;s++){let i=n[s],a=e[i],l=this.o[i];if(l){if(l.type!=="document"&&l.type!=="compound")throw new Error(`Cannot use parsing instruction for operator "${i}" in "document" context as it is supposed to be used in "${l.type}" context`);pe(r,this.parseInstruction(l,a,this.i))}else this.s.hasOperators(a)?r.push(...this.parseFieldOperators(i,a)):pe(r,this.parseField(i,this.u.defaultOperatorName,a,e))}return this.u.mergeFinalConditions(r)}};function de(t,e){let r=t[e];if(typeof r!="function")throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return r}function ur(t){return t.operator}function pt(t,e){let r=e,n=r&&r.getInterpreterName||ur,s;switch(r?r.numberOfArguments:0){case 1:s=i=>{let a=n(i,r);return de(t,a)(i,o)};break;case 3:s=(i,a,l)=>{let u=n(i,r);return de(t,u)(i,a,l,o)};break;default:s=(i,a)=>{let l=n(i,r);return de(t,l)(i,a,o)}}let o=Object.assign({},r,{interpret:s});return o.interpret}function dt(t,e){return(r,...n)=>{let s=t(r,...n),o=e.bind(null,s);return o.ast=s,o}}var an=G.prototype.parseInstruction;function ht(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function mt(t,e){if(ht(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}var ge=t=>(e,r)=>{if(typeof r!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},yt={type:"compound",validate:mt,parse(t,e,{parse:r}){let n=e.map(s=>r(s));return ye(t.name,n)}},lr=yt,fr={type:"compound",validate:mt},pr={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,e,r){let n=e instanceof RegExp?new _("regex",r.field,e):r.parse(e,r);return new S(t.name,[n])}},xe={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:r,field:n,hasOperators:s}){let o=s(e)?r(e,{field:N}):r(e);return new _(t.name,n,o)}},Oe={type:"field",validate:ge("number")},z={type:"field",validate:ht},we=z,ve=z,dr={type:"field",validate(t,e){if(!Array.isArray(e)||e.length!==2)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},je={type:"field",validate:ge("boolean")},X={type:"field",validate:function(t,e){if(!(typeof e=="string"||typeof e=="number"||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},V=X,Ae=V,$e=V,ee={type:"field"},Ee=ee,Ie={type:"field",validate(t,e){if(!(e instanceof RegExp)&&typeof e!="string")throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,r){let n=typeof e=="string"?new RegExp(e,r.query.$options||""):e;return new _(t.name,r.field,n)}},Ne={type:"field",parse:()=>me},hr={type:"document",validate:ge("function")},mr=Object.freeze({__proto__:null,$and:yt,$or:lr,$nor:fr,$not:pr,$elemMatch:xe,$size:Oe,$in:z,$nin:we,$all:ve,$mod:dr,$exists:je,$gte:X,$gt:V,$lt:Ae,$lte:$e,$eq:ee,$ne:Ee,$regex:Ie,$options:Ne,$where:hr}),W=class extends G{constructor(e){super(e,{defaultOperatorName:"$eq",operatorToConditionName:r=>r.slice(1)})}parse(e,r){return r&&r.field?be(this.parseFieldOperators(r.field,e)):super.parse(e)}},te=mr;function Fe(t,e,r){for(let n=0,s=t.length;n<s;n++)if(r(t[n],e)===0)return!0;return!1}function Me(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function bt(t,e,r){if(!Me(t,e))return r(t,e);let n=[];for(let s=0;s<t.length;s++){let o=r(t[s],e);o!==void 0&&(n=n.concat(o))}return n}function R(t){return(e,r,n)=>{let s=n.get(r,e.field);return Array.isArray(s)?s.some(o=>t(e,o,n)):t(e,s,n)}}var yr=Object.hasOwn||Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty),br=(t,e)=>t[e];function gt(t,e,r){let n=e.lastIndexOf(".");return n===-1?[t,e]:[r(t,e.slice(0,n)),e.slice(n+1)]}function gr(t,e,r=br){if(e===N)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return(function(n,s,o){if(s.indexOf(".")===-1)return bt(n,s,o);let i=s.split("."),a=n;for(let l=0,u=i.length;l<u;l++)if(a=bt(a,i[l],o),!a||typeof a!="object")return l<u-1?void 0:a;return a})(t,e,r)}function Ce(t,e){return t===e?0:t>e?1:-1}function Se(t,e={}){return pt(t,Object.assign({get:gr,compare:Ce},e))}var xt=(t,e,{interpret:r})=>t.value.some(n=>r(n,e)),xr=(t,e,r)=>!xt(t,e,r),_e=(t,e,{interpret:r})=>t.value.every(n=>r(n,e)),Or=(t,e,{interpret:r})=>!r(t.value[0],e),re=(t,e,{compare:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&!Array.isArray(t.value)?Fe(s,t.value,r):r(s,t.value)===0},Re=(t,e,r)=>!re(t,e,r),ke=R((t,e,r)=>{let n=r.compare(e,t.value);return n===0||n===-1}),De=R((t,e,r)=>r.compare(e,t.value)===-1),Pe=R((t,e,r)=>r.compare(e,t.value)===1),Te=R((t,e,r)=>{let n=r.compare(e,t.value);return n===0||n===1}),Ue=(t,e,{get:r})=>{if(t.field===N)return e!==void 0;let[n,s]=gt(e,t.field,r),o=i=>i==null?!!i===t.value:yr(i,s)===t.value;return Me(n,s)?n.some(o):o(n)},wr=R((t,e)=>typeof e=="number"&&e%t.value[0]===t.value[1]),qe=(t,e,{get:r})=>{let[n,s]=gt(e,t.field,r),o=i=>{let a=r(i,s);return Array.isArray(a)&&a.length===t.value};return t.field!==N&&Me(n,s)?n.some(o):o(n)},Le=R((t,e)=>typeof e=="string"&&t.value.test(e)),Y=R((t,e,{compare:r})=>Fe(t.value,e,r)),Be=(t,e,r)=>!Y(t,e,r),Ge=(t,e,{compare:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&t.value.every(o=>Fe(s,o,r))},ze=(t,e,{interpret:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&s.some(o=>r(t.value,o))},vr=(t,e)=>t.value.call(e),jr=Object.freeze({__proto__:null,or:xt,nor:xr,and:_e,not:Or,eq:re,ne:Re,lte:ke,lt:De,gt:Pe,gte:Te,exists:Ue,mod:wr,size:qe,regex:Le,within:Y,nin:Be,all:Ge,elemMatch:ze,where:vr}),ne=Object.assign({},jr,{in:Y}),dn=Se(ne);function Ot(t){return t===null||typeof t!="object"?t:t instanceof Date?t.getTime():t&&typeof t.toJSON=="function"?t.toJSON():t}var Ar=(t,e)=>Ce(Ot(t),Ot(e));function se(t,e,r){let n=new W(t),s=Se(e,Object.assign({compare:Ar},r));if(r&&r.forPrimitives){let o={field:N},i=n.parse;n.setParse(a=>i(a,o))}return dt(n.parse,s)}var gn=se(te,ne),xn=se(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},te,{$nor:Object.assign({},te.$nor,{type:"field",parse:Q.compound})})),ne,{forPrimitives:!0});var Et=Object.hasOwn||((t,e)=>Object.prototype.hasOwnProperty.call(t,e));function Ve(t){return Array.isArray(t)?t:[t]}var T="__caslSubjectType__";function It(t,e){if(e){if(!Et(e,T))Object.defineProperty(e,T,{value:t});else if(t!==e[T])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[T]}`)}return e}var ie=t=>{let e=typeof t;return e==="string"||e==="function"},Nt=t=>t.modelName||t.name;function $r(t){return typeof t=="string"?t:Nt(t)}function Ft(t){return Et(t,T)?t[T]:Nt(t.constructor)}var wt={function:t=>t.constructor,string:Ft};function vt(t,e,r){for(let n=r;n<e.length;n++)t.push(e[n])}function jt(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let r=0,n=0,s=[];for(;r<t.length&&n<e.length;)t[r].priority<e[n].priority?(s.push(t[r]),r++):t[r].priority>e[n].priority?(s.push(e[n]),n++):(s.push(t[r]),r++,n++);return vt(s,t,r),vt(s,e,n),s}function oe(t,e,r){let n=t.get(e);return n||(n=r(),t.set(e,n)),n}var Er=t=>t;function Ir(t,e){let r;for(let n=0;n<t.length;n++){let s=e(t[n]);r&&s&&r.push(t[n]),s||(r??=t.slice(0,n))}return r||t}function Nr(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var Ye=class{constructor(e,r,n=0){Nr(e,r),this.action=r.resolveAction(e.action),this.subject=e.subject,this.inverted=!!e.inverted,this.conditions=e.conditions,this.reason=e.reason,this.origin=e,this.fields=e.fields?Ve(e.fields):void 0,this.priority=n,this.t=r}i(){return this.conditions&&!this.o&&(this.o=this.t.conditionsMatcher(this.conditions)),this.o}get ast(){let e=this.i();return e?e.ast:void 0}matchesConditions(e){return this.conditions?!e||ie(e)?!this.inverted:this.i()(e):!0}matchesField(e){return this.fields?e?(this.u||(this.u=this.t.fieldMatcher(this.fields)),this.u(e)):!this.inverted:!0}};function Fr(t,e){let r={value:t,prev:e,next:null};return e&&(e.next=r),r}function Mr(t){t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next),t.next=t.prev=null}var At=()=>({rules:[],merged:!1}),$t=()=>new Map,Je=class{constructor(e=[],r={}){this.h=!1,this.l=new Map,this.p={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||Er},this.$=r.anyAction||"manage",this.A=r.anySubjectType||"all",this.m=e,this.M=!!r.detectSubjectType,this.j=r.detectSubjectType||Ft,this.v(e)}get rules(){return this.m}detectSubjectType(e){return ie(e)?e:e?this.j(e):this.A}update(e){let r={rules:e,ability:this,target:this};return this._("update",r),this.m=e,this.v(e),this._("updated",r),this}v(e){let r=new Map,n;for(let s=e.length-1;s>=0;s--){let o=e.length-s-1,i=new Ye(e[s],this.p,o),a=Ve(i.action),l=Ve(i.subject||this.A);!this.h&&i.fields&&(this.h=!0);for(let u=0;u<l.length;u++){let c=oe(r,l[u],$t);n===void 0&&(n=typeof l[u]),typeof l[u]!==n&&n!=="mixed"&&(n="mixed");for(let p=0;p<a.length;p++)oe(c,a[p],At).rules.push(i)}}if(this.l=r,n!=="mixed"&&!this.M){let s=wt[n]||wt.string;this.j=s}}possibleRulesFor(e,r=this.A){if(!ie(r))throw new Error('"possibleRulesFor" accepts only subject types (i.e., string or class) as the 2nd parameter');let n=oe(this.l,r,$t),s=oe(n,e,At);if(s.merged)return s.rules;let o=e!==this.$&&n.has(this.$)?n.get(this.$).rules:void 0,i=jt(s.rules,o);return r!==this.A&&(i=jt(i,this.possibleRulesFor(e,this.A))),s.rules=i,s.merged=!0,i}rulesFor(e,r,n){let s=this.possibleRulesFor(e,r);if(n&&typeof n!="string")throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");return this.h?Ir(s,o=>o.matchesField(n)):s}actionsFor(e){if(!ie(e))throw new Error('"actionsFor" accepts only subject types (i.e., string or class) as a parameter');let r=new Set,n=this.l.get(e);n&&Array.from(n.keys()).forEach(o=>r.add(o));let s=e!==this.A?this.l.get(this.A):void 0;return s&&Array.from(s.keys()).forEach(o=>r.add(o)),Array.from(r)}on(e,r){this.F=this.F||new Map;let n=this.F,s=n.get(e)||null,o=Fr(r,s);return n.set(e,o),()=>{let i=n.get(e);!o.next&&!o.prev&&i===o?n.delete(e):o===i&&n.set(e,o.prev),Mr(o)}}_(e,r){if(!this.F)return;let n=this.F.get(e)||null,s=[];for(;n!==null;)s.push(n.value),n=n.prev;for(let o=0;o<s.length;o++)s[o](r)}},Ke=class extends Je{can(e,r,n){let s=this.relevantRuleFor(e,r,n);return!!s&&!s.inverted}relevantRuleFor(e,r,n){let s=this.detectSubjectType(r),o=this.rulesFor(e,s,n);for(let i=0,a=o.length;i<a;i++)if(o[i].matchesConditions(r))return o[i];return null}cannot(e,r,n){return!this.can(e,r,n)}},Cr={$eq:ee,$ne:Ee,$lt:Ae,$lte:$e,$gt:V,$gte:X,$in:z,$nin:we,$all:ve,$size:Oe,$regex:Ie,$options:Ne,$elemMatch:xe,$exists:je},Sr={eq:re,ne:Re,lt:De,lte:ke,gt:Pe,gte:Te,in:Y,nin:Be,all:Ge,size:qe,regex:Le,elemMatch:ze,exists:Ue,and:_e};var _r=se(Cr,Sr),Rr=/[-/\\^$+?.()|[\]{}]/g,kr=/\.?\*+\.?/g,Dr=/\*+/,Pr=/\./g;function Tr(t,e,r){let n=r[0]==="*"||t[0]==="."&&t[t.length-1]==="."?"+":"*",s=t.indexOf("**")===-1?"[^.]":".",o=t.replace(Pr,"\\$&").replace(Dr,s+n);return e+t.length===r.length?`(?:${o})?`:o}function Ur(t,e,r){return t==="."&&(r[e-1]==="*"||r[e+1]==="*")?t:`\\${t}`}function qr(t){let e=t.map(n=>n.replace(Rr,Ur).replace(kr,Tr)),r=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${r}$`)}var Lr=t=>{let e;return r=>(typeof e>"u"&&(e=t.every(n=>n.indexOf("*")===-1)?null:qr(t)),e===null?t.indexOf(r)!==-1:e.test(r))};function Mt(t=[],e={}){return new Ke(t,Object.assign({conditionsMatcher:_r,fieldMatcher:Lr},e))}var Br=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`,Ct=function(e){this.message=e};Ct.prototype=Object.create(Error.prototype);var Ze=class extends Ct{static setDefaultMessage(e){this.P=typeof e=="string"?()=>e:e}static from(e){return new this(e)}constructor(e){super(""),this.ability=e,typeof Error.captureStackTrace=="function"&&(this.name="ForbiddenError",Error.captureStackTrace(this,this.constructor))}setMessage(e){return this.message=e,this}throwUnlessCan(e,r,n){let s=this.unlessCan(e,r,n);if(s)throw s}unlessCan(e,r,n){let s=this.ability.relevantRuleFor(e,r,n);if(s&&!s.inverted)return;this.action=e,this.subject=r,this.subjectType=$r(this.ability.detectSubjectType(r)),this.field=n;let o=s?s.reason:"";return this.message=this.message||o||this.constructor.P(this),this}};Ze.P=Br;var $n=Object.freeze({__proto__:null});function He(t,e,r){if(t==null)return t;if(typeof t=="string"){if(t.indexOf("$principal.")!==0)return t;let s=t.slice(11).split(".").reduce((o,i)=>o==null?o:o[i],e);return s==null&&(r.unresolved=!0),s}if(Array.isArray(t))return t.map(n=>He(n,e,r));if(typeof t=="object"){let n={};for(let s of Object.keys(t))n[s]=He(t[s],e,r);return n}return t}function ae(t,e){let r={unresolved:!1};return{conditions:He(t,e,r),unresolved:r.unresolved}}function St(t,e){return ae(t,e).conditions}function k(t,e){let r=P(t,e),n=[];for(let s of e.rules){if(r.indexOf(s.subject)===-1)continue;let o={action:s.actions,subject:s.resource};if(s.where){let{conditions:i,unresolved:a}=ae(s.where,t);if(a)continue;o.conditions=i}n.push(o)}return n}function Qe(t){return Mt(Array.isArray(t)?t:[])}function ce(t,e){return Qe(k(t,e))}function w(t,e,r,n){return n==null?t.can(e,r):t.can(e,It(r,Object.assign({},n)))}var v={ALL:"all",NONE:"none",FIELDS:"fields",AMBIGUOUS:"ambiguous"},_t={$in:"in",$nin:"nin",$ne:"ne",$gt:"gt",$gte:"gte",$lt:"lt",$lte:"lte"};function Gr(t){let e=[];for(let r of Object.keys(t)){let n=t[r];if(n===null||typeof n!="object"||Array.isArray(n)){e.push({field:r,op:"eq",value:n});continue}let s=Object.keys(n);if(s.length!==1||!_t[s[0]])return null;e.push({field:r,op:_t[s[0]],value:n[s[0]]})}return e}var zr=(t,e)=>t==="manage"||t===e||Array.isArray(t)&&(t.indexOf(e)!==-1||t.indexOf("manage")!==-1),Vr=(t,e)=>t==="all"||t===e;function ue(t,e,r,n){let s=k(t,e).filter(i=>zr(i.action,r)&&Vr(i.subject,n));if(s.length===0)return{scope:v.NONE,clauses:[]};if(s.some(i=>!i.conditions))return{scope:v.ALL,clauses:[]};if(s.length>1)return{scope:v.AMBIGUOUS,clauses:[]};let o=Gr(s[0].conditions);return o?{scope:v.FIELDS,clauses:o}:{scope:v.AMBIGUOUS,clauses:[]}}function le(t,e){let r=t;for(let n of e)n.op==="in"?r=r.hasSome(n.field,n.value):n.op==="nin"?r=r.not(r.hasSome(n.field,n.value)):r=r[n.op](n.field,n.value);return r}var We=/export\s+const\s+([A-Za-z0-9_$]+)\s*=\s*webMethod\s*\(\s*Permissions\s*\.\s*([A-Za-z0-9_$]+)/g,Yr=[[/export\s*{\s*[A-Za-z0-9_$,\s]+}/,"export { x } \u2014 the call and the export must be one statement"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*Permissions\s*\[/,"Permissions['X'] \u2014 the property must be dotted and literal"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*[A-Za-z0-9_$]+\s*\(/,"a computed permission \u2014 it must be written out as Permissions.LEVEL"]];function Xe(t){let e={},r=String(t||"");We.lastIndex=0;let n=We.exec(r);for(;n;)e[n[1]]=n[2],n=We.exec(r);return e}function et(t,e,r){let n=r||{},s=e&&e.api||{},o=Xe(t),i=String(t||""),a=[],l=[];for(let f of Object.keys(o)){let d=s[f];d?d.permission!==o[f]&&a.push({name:f,declared:d.permission,written:o[f]}):l.push({name:f,gate:o[f]})}let u=n.complete?Object.keys(s).filter(f=>!(f in o)):[],c=[];for(let[f,d]of Yr)f.test(i)&&c.push(d);return{ok:a.length+l.length+u.length+c.length===0,found:o,mismatched:a,undeclared:l,missing:u,suspect:c}}function Rt(t,e,r){let n=et(t,e,r);if(n.ok)return!0;let s=[];for(let o of n.mismatched)s.push(o.name+": policy says "+o.declared+", the export says "+o.written);for(let o of n.undeclared)s.push(o.name+": gated "+o.gate+" but missing from policy.api");for(let o of n.missing)s.push(o+": declared in policy.api but not exported here");for(let o of n.suspect)s.push("unreachable export shape \u2014 "+o);throw new Error(`wix-access: web-method gates do not match the policy:
|
|
1
|
+
var tr=Object.create;var ee=Object.defineProperty;var rr=Object.getOwnPropertyDescriptor;var nr=Object.getOwnPropertyNames;var sr=Object.getPrototypeOf,or=Object.prototype.hasOwnProperty;var ir=(t,e)=>{for(var r in e)ee(t,r,{get:e[r],enumerable:!0})},pt=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let s of nr(e))!or.call(t,s)&&s!==r&&ee(t,s,{get:()=>e[s],enumerable:!(n=rr(e,s))||n.enumerable});return t};var ar=(t,e,r)=>(r=t!=null?tr(sr(t)):{},pt(e||!t||!t.__esModule?ee(r,"default",{value:t,enumerable:!0}):r,t)),cr=t=>pt(ee({},"__esModule",{value:!0}),t);var un={};ir(un,{ASSIGN_OWNER:()=>F,CASES:()=>lt,CODES:()=>w,KIND:()=>D,PACKAGE_VERSION:()=>ut,PolicyError:()=>P,SCOPE:()=>C,WHEN:()=>k,abilityFor:()=>me,abilityFromRules:()=>ot,anonymous:()=>yt,applyClauses:()=>be,applyGates:()=>Vt,assertDeclared:()=>Jt,assertGates:()=>Gt,backendMemberId:()=>cn,backendPing:()=>an,can:()=>j,caseTable:()=>zt,createAccess:()=>on,createPrincipal:()=>W,deny:()=>I,denyOpaque:()=>N,filterFor:()=>ye,hasRole:()=>te,isDenial:()=>mt,normaliseRoles:()=>Oe,ok:()=>ht,parseGates:()=>at,permissionFor:()=>gt,resolvePlaceholders:()=>Bt,resolveSubjects:()=>V,resolveWhere:()=>he,rulesFor:()=>q,validatePolicy:()=>re,verifyGates:()=>ct});module.exports=cr(un);var ft=require("wix-members-backend"),Qt=ar(require("wix-users-backend"),1),Xt=require("@wix/data"),er=require("@wix/essentials");var w={FORBIDDEN:"FORBIDDEN",UNAUTHENTICATED:"UNAUTHENTICATED",UNVERIFIED:"UNVERIFIED",NOT_FOUND:"NOT_FOUND",INVALID_POLICY:"INVALID_POLICY",INVALID_ARGUMENT:"INVALID_ARGUMENT"},P=class extends Error{constructor(e){super(e),this.name="PolicyError",this.code=w.INVALID_POLICY}};function ht(t){return{ok:!0,data:t===void 0?null:t}}function I(t,e,r){let n={ok:!1,code:t||w.FORBIDDEN};return e&&(n.action=e),r&&(n.detail=r),n}var mt=t=>!!t&&t.ok===!1;function N(t){return I(w.NOT_FOUND,t)}var D={VISITOR:"visitor",MEMBER:"member",CAPABILITY:"capability",SERVICE:"service"};function Oe(t){if(!Array.isArray(t))return[];let e=[];for(let r of t){if(typeof r=="string"){e.push(r);continue}if(!r||typeof r!="object")continue;let n=r.title||r.name||r.roleKey;n&&e.push(n)}return e}function W(t){let e=t||{},r=e.memberId||null,n=Oe(e.roles);return{kind:e.kind||(r?D.MEMBER:D.VISITOR),memberId:r,roles:n,subjects:Array.isArray(e.subjects)?e.subjects.slice():[],domain:e.domain&&typeof e.domain=="object"?e.domain:{},unverified:!!e.unverified}}var yt=()=>W({kind:D.VISITOR}),te=(t,e)=>t.roles.indexOf(e)!==-1;var k={ANYONE:"anyone",ANONYMOUS:"anonymous",MEMBER:"member"},_=t=>!!t&&typeof t=="object"&&!Array.isArray(t),ur=t=>Array.isArray(t)?t:[t];function b(t,e){throw new P("policy"+t+": "+e)}function lr(t,e){let r=".subjects."+t;_(e)||b(r,"must be an object");let s=["when","role","domain"].filter(o=>e[o]!==void 0);if(s.length===0&&b(r,'needs exactly one of when/role/domain \u2014 "{}" is ambiguous between a visitor and a member'),s.length>1&&b(r,"has "+s.join(" and ")+"; use exactly one"),e.when!==void 0){let o=[k.ANYONE,k.ANONYMOUS,k.MEMBER];o.indexOf(e.when)===-1&&b(r+".when","must be one of "+o.join(", ")+" (got "+JSON.stringify(e.when)+")")}e.role!==void 0&&typeof e.role!="string"&&b(r+".role","must be a string"),e.domain!==void 0&&typeof e.domain!="string"&&b(r+".domain","must be a string")}function fr(t,e,r){let n=".rules["+e+"]";_(t)||b(n,"must be an object"),typeof t.subject!="string"&&b(n+".subject","must be a string"),r.indexOf(t.subject)===-1&&b(n+".subject",'"'+t.subject+'" is not declared in policy.subjects'),t.actions===void 0&&b(n+".actions","is required");for(let s of ur(t.actions))typeof s!="string"&&b(n+".actions","must be a string or an array of strings");typeof t.resource!="string"&&b(n+".resource","must be a string"),t.where!==void 0&&!_(t.where)&&b(n+".where","must be an object")}var bt=["Anyone","SiteMember","Admin"];function dr(t,e,r){let n=".api."+t;_(e)||b(n,"must be an object"),bt.indexOf(e.permission)===-1&&b(n+".permission","must be one of "+bt.join(", ")+" (got "+JSON.stringify(e.permission)+")"),e.ability!==void 0&&((!Array.isArray(e.ability)||e.ability.length!==2)&&b(n+".ability","must be [action, resource]"),(typeof e.ability[0]!="string"||typeof e.ability[1]!="string")&&b(n+".ability","both entries must be strings")),e.subject!==void 0&&r.indexOf(e.subject)===-1&&b(n+".subject",'"'+e.subject+'" is not declared in policy.subjects')}var pr=["resource","owner","actor","tenant","profile"];function hr(t,e){let r=".collections."+t;_(e)||b(r,"must be an object");for(let n of pr)e[n]!==void 0&&(typeof e[n]!="string"||!e[n])&&b(r+"."+n,"must be a non-empty string");e.owner!==void 0&&e.owner===e.actor&&b(r,'owner and actor must be different fields (both are "'+e.owner+'")')}function re(t){if(!_(t))throw new P("policy must be an object");_(t.subjects)||b(".subjects","is required and must be an object");let e=Object.keys(t.subjects);e.length===0&&b(".subjects","declares no subjects");for(let r of e)lr(r,t.subjects[r]);if(Array.isArray(t.rules)||b(".rules","is required and must be an array"),t.rules.forEach((r,n)=>fr(r,n,e)),t.api!==void 0){_(t.api)||b(".api","must be an object");for(let r of Object.keys(t.api))dr(r,t.api[r],e)}if(t.collections!==void 0){_(t.collections)||b(".collections","must be an object");for(let r of Object.keys(t.collections))hr(r,t.collections[r])}return t}function V(t,e){let r=new Set(t.subjects||[]);for(let n of Object.keys(e.subjects)){let s=e.subjects[n];(s.when===k.ANYONE||s.when===k.ANONYMOUS&&!t.memberId||s.when===k.MEMBER&&t.memberId||s.role!==void 0&&t.roles.indexOf(s.role)!==-1||s.domain!==void 0&&t.domain[s.domain])&&r.add(n)}return Array.from(r)}function gt(t,e){let r=t.api&&t.api[e];return r?r.permission:null}var ne=class{constructor(e,r){this.operator=e,this.value=r,Object.defineProperty(this,"t",{writable:!0})}get notes(){return this.t}addNote(e){this.t=this.t||[],this.t.push(e)}},J=class extends ne{},U=class extends J{constructor(e,r){if(!Array.isArray(r))throw new Error(`"${e}" operator expects to receive an array of conditions`);super(e,r)}},T="__itself__",L=class extends ne{constructor(e,r,n){super(e,n),this.field=r}},je=new J("__null__",null),ve=Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);function mr(t,e){return e instanceof U&&e.operator===t}function Ae(t,e){return e.length===1?e[0]:new U(t,(function r(n,s,o){let i=o||[];for(let c=0,l=s.length;c<l;c++){let u=s[c];mr(n,u)?r(n,u.value,i):i.push(u)}return i})(t,e))}var yr=t=>t,Ot=()=>Object.create(null),xt=Object.defineProperty(Ot(),"__@type@__",{value:"ignore value"});function br(t,e,r=!1){if(!t||t&&t.constructor!==Object)return!1;for(let n in t)if(ve(t,n)&&ve(e,n)&&(!r||t[n]!==xt))return!0;return!1}function gr(t){let e=[];for(let r in t)ve(t,r)&&t[r]!==xt&&e.push(r);return e}function xe(t,e){e!==je&&t.push(e)}var Ee=t=>Ae("and",t);var se={compound(t,e,r){let n=(Array.isArray(e)?e:[e]).map(s=>r.parse(s));return new U(t.name,n)},field:(t,e,r)=>new L(t.name,r.field,e),document:(t,e)=>new J(t.name,e)},K=class{constructor(e,r=Ot()){this.o=void 0,this.s=void 0,this.i=void 0,this.u=void 0,this.h=void 0,this.parse=this.parse.bind(this),this.u={operatorToConditionName:r.operatorToConditionName||yr,defaultOperatorName:r.defaultOperatorName||"eq",mergeFinalConditions:r.mergeFinalConditions||Ee},this.o=Object.keys(e).reduce((n,s)=>(n[s]=Object.assign({name:this.u.operatorToConditionName(s)},e[s]),n),{}),this.s=Object.assign({},r.fieldContext,{field:"",query:{},parse:this.parse,hasOperators:n=>br(n,this.o,r.useIgnoreValue)}),this.i=Object.assign({},r.documentContext,{parse:this.parse,query:{}}),this.h=r.useIgnoreValue?gr:Object.keys}setParse(e){this.parse=e,this.s.parse=e,this.i.parse=e}parseField(e,r,n,s){let o=this.o[r];if(!o)throw new Error(`Unsupported operator "${r}"`);if(o.type!=="field")throw new Error(`Unexpected ${o.type} operator "${r}" at field level`);return this.s.field=e,this.s.query=s,this.parseInstruction(o,n,this.s)}parseInstruction(e,r,n){return typeof e.validate=="function"&&e.validate(e,r),(e.parse||se[e.type])(e,r,n)}parseFieldOperators(e,r){let n=[],s=this.h(r);for(let o=0,i=s.length;o<i;o++){let c=s[o];if(!this.o[c])throw new Error(`Field query for "${e}" may contain only operators or a plain object as a value`);xe(n,this.parseField(e,c,r[c],r))}return n}parse(e){let r=[],n=this.h(e);this.i.query=e;for(let s=0,o=n.length;s<o;s++){let i=n[s],c=e[i],l=this.o[i];if(l){if(l.type!=="document"&&l.type!=="compound")throw new Error(`Cannot use parsing instruction for operator "${i}" in "document" context as it is supposed to be used in "${l.type}" context`);xe(r,this.parseInstruction(l,c,this.i))}else this.s.hasOperators(c)?r.push(...this.parseFieldOperators(i,c)):xe(r,this.parseField(i,this.u.defaultOperatorName,c,e))}return this.u.mergeFinalConditions(r)}};function we(t,e){let r=t[e];if(typeof r!="function")throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return r}function Or(t){return t.operator}function wt(t,e){let r=e,n=r&&r.getInterpreterName||Or,s;switch(r?r.numberOfArguments:0){case 1:s=i=>{let c=n(i,r);return we(t,c)(i,o)};break;case 3:s=(i,c,l)=>{let u=n(i,r);return we(t,u)(i,c,l,o)};break;default:s=(i,c)=>{let l=n(i,r);return we(t,l)(i,c,o)}}let o=Object.assign({},r,{interpret:s});return o.interpret}function vt(t,e){return(r,...n)=>{let s=t(r,...n),o=e.bind(null,s);return o.ast=s,o}}var bn=K.prototype.parseInstruction;function jt(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function At(t,e){if(jt(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}var $e=t=>(e,r)=>{if(typeof r!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},Et={type:"compound",validate:At,parse(t,e,{parse:r}){let n=e.map(s=>r(s));return Ae(t.name,n)}},xr=Et,wr={type:"compound",validate:At},vr={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,e,r){let n=e instanceof RegExp?new L("regex",r.field,e):r.parse(e,r);return new U(t.name,[n])}},Ie={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:r,field:n,hasOperators:s}){let o=s(e)?r(e,{field:T}):r(e);return new L(t.name,n,o)}},Ne={type:"field",validate:$e("number")},Z={type:"field",validate:jt},Fe=Z,Me=Z,jr={type:"field",validate(t,e){if(!Array.isArray(e)||e.length!==2)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},Ce={type:"field",validate:$e("boolean")},ie={type:"field",validate:function(t,e){if(!(typeof e=="string"||typeof e=="number"||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},H=ie,Se=H,_e=H,ae={type:"field"},Re=ae,De={type:"field",validate(t,e){if(!(e instanceof RegExp)&&typeof e!="string")throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,r){let n=typeof e=="string"?new RegExp(e,r.query.$options||""):e;return new L(t.name,r.field,n)}},ke={type:"field",parse:()=>je},Ar={type:"document",validate:$e("function")},Er=Object.freeze({__proto__:null,$and:Et,$or:xr,$nor:wr,$not:vr,$elemMatch:Ie,$size:Ne,$in:Z,$nin:Fe,$all:Me,$mod:jr,$exists:Ce,$gte:ie,$gt:H,$lt:Se,$lte:_e,$eq:ae,$ne:Re,$regex:De,$options:ke,$where:Ar}),oe=class extends K{constructor(e){super(e,{defaultOperatorName:"$eq",operatorToConditionName:r=>r.slice(1)})}parse(e,r){return r&&r.field?Ee(this.parseFieldOperators(r.field,e)):super.parse(e)}},ce=Er;function Te(t,e,r){for(let n=0,s=t.length;n<s;n++)if(r(t[n],e)===0)return!0;return!1}function Pe(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function $t(t,e,r){if(!Pe(t,e))return r(t,e);let n=[];for(let s=0;s<t.length;s++){let o=r(t[s],e);o!==void 0&&(n=n.concat(o))}return n}function B(t){return(e,r,n)=>{let s=n.get(r,e.field);return Array.isArray(s)?s.some(o=>t(e,o,n)):t(e,s,n)}}var $r=Object.hasOwn||Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty),Ir=(t,e)=>t[e];function It(t,e,r){let n=e.lastIndexOf(".");return n===-1?[t,e]:[r(t,e.slice(0,n)),e.slice(n+1)]}function Nr(t,e,r=Ir){if(e===T)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return(function(n,s,o){if(s.indexOf(".")===-1)return $t(n,s,o);let i=s.split("."),c=n;for(let l=0,u=i.length;l<u;l++)if(c=$t(c,i[l],o),!c||typeof c!="object")return l<u-1?void 0:c;return c})(t,e,r)}function Ue(t,e){return t===e?0:t>e?1:-1}function Le(t,e={}){return wt(t,Object.assign({get:Nr,compare:Ue},e))}var Nt=(t,e,{interpret:r})=>t.value.some(n=>r(n,e)),Fr=(t,e,r)=>!Nt(t,e,r),Be=(t,e,{interpret:r})=>t.value.every(n=>r(n,e)),Mr=(t,e,{interpret:r})=>!r(t.value[0],e),ue=(t,e,{compare:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&!Array.isArray(t.value)?Te(s,t.value,r):r(s,t.value)===0},qe=(t,e,r)=>!ue(t,e,r),Ge=B((t,e,r)=>{let n=r.compare(e,t.value);return n===0||n===-1}),Ve=B((t,e,r)=>r.compare(e,t.value)===-1),ze=B((t,e,r)=>r.compare(e,t.value)===1),Ye=B((t,e,r)=>{let n=r.compare(e,t.value);return n===0||n===1}),We=(t,e,{get:r})=>{if(t.field===T)return e!==void 0;let[n,s]=It(e,t.field,r),o=i=>i==null?!!i===t.value:$r(i,s)===t.value;return Pe(n,s)?n.some(o):o(n)},Cr=B((t,e)=>typeof e=="number"&&e%t.value[0]===t.value[1]),Je=(t,e,{get:r})=>{let[n,s]=It(e,t.field,r),o=i=>{let c=r(i,s);return Array.isArray(c)&&c.length===t.value};return t.field!==T&&Pe(n,s)?n.some(o):o(n)},Ke=B((t,e)=>typeof e=="string"&&t.value.test(e)),Q=B((t,e,{compare:r})=>Te(t.value,e,r)),Ze=(t,e,r)=>!Q(t,e,r),He=(t,e,{compare:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&t.value.every(o=>Te(s,o,r))},Qe=(t,e,{interpret:r,get:n})=>{let s=n(e,t.field);return Array.isArray(s)&&s.some(o=>r(t.value,o))},Sr=(t,e)=>t.value.call(e),_r=Object.freeze({__proto__:null,or:Nt,nor:Fr,and:Be,not:Mr,eq:ue,ne:qe,lte:Ge,lt:Ve,gt:ze,gte:Ye,exists:We,mod:Cr,size:Je,regex:Ke,within:Q,nin:Ze,all:He,elemMatch:Qe,where:Sr}),le=Object.assign({},_r,{in:Q}),jn=Le(le);function Ft(t){return t===null||typeof t!="object"?t:t instanceof Date?t.getTime():t&&typeof t.toJSON=="function"?t.toJSON():t}var Rr=(t,e)=>Ue(Ft(t),Ft(e));function fe(t,e,r){let n=new oe(t),s=Le(e,Object.assign({compare:Rr},r));if(r&&r.forPrimitives){let o={field:T},i=n.parse;n.setParse(c=>i(c,o))}return vt(n.parse,s)}var Nn=fe(ce,le),Fn=fe(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},ce,{$nor:Object.assign({},ce.$nor,{type:"field",parse:se.compound})})),le,{forPrimitives:!0});var Dt=Object.hasOwn||((t,e)=>Object.prototype.hasOwnProperty.call(t,e));function Xe(t){return Array.isArray(t)?t:[t]}var z="__caslSubjectType__";function kt(t,e){if(e){if(!Dt(e,z))Object.defineProperty(e,z,{value:t});else if(t!==e[z])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[z]}`)}return e}var pe=t=>{let e=typeof t;return e==="string"||e==="function"},Tt=t=>t.modelName||t.name;function Dr(t){return typeof t=="string"?t:Tt(t)}function Pt(t){return Dt(t,z)?t[z]:Tt(t.constructor)}var Mt={function:t=>t.constructor,string:Pt};function Ct(t,e,r){for(let n=r;n<e.length;n++)t.push(e[n])}function St(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let r=0,n=0,s=[];for(;r<t.length&&n<e.length;)t[r].priority<e[n].priority?(s.push(t[r]),r++):t[r].priority>e[n].priority?(s.push(e[n]),n++):(s.push(t[r]),r++,n++);return Ct(s,t,r),Ct(s,e,n),s}function de(t,e,r){let n=t.get(e);return n||(n=r(),t.set(e,n)),n}var kr=t=>t;function Tr(t,e){let r;for(let n=0;n<t.length;n++){let s=e(t[n]);r&&s&&r.push(t[n]),s||(r??=t.slice(0,n))}return r||t}function Pr(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var et=class{constructor(e,r,n=0){Pr(e,r),this.action=r.resolveAction(e.action),this.subject=e.subject,this.inverted=!!e.inverted,this.conditions=e.conditions,this.reason=e.reason,this.origin=e,this.fields=e.fields?Xe(e.fields):void 0,this.priority=n,this.t=r}i(){return this.conditions&&!this.o&&(this.o=this.t.conditionsMatcher(this.conditions)),this.o}get ast(){let e=this.i();return e?e.ast:void 0}matchesConditions(e){return this.conditions?!e||pe(e)?!this.inverted:this.i()(e):!0}matchesField(e){return this.fields?e?(this.u||(this.u=this.t.fieldMatcher(this.fields)),this.u(e)):!this.inverted:!0}};function Ur(t,e){let r={value:t,prev:e,next:null};return e&&(e.next=r),r}function Lr(t){t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next),t.next=t.prev=null}var _t=()=>({rules:[],merged:!1}),Rt=()=>new Map,tt=class{constructor(e=[],r={}){this.h=!1,this.l=new Map,this.p={conditionsMatcher:r.conditionsMatcher,fieldMatcher:r.fieldMatcher,resolveAction:r.resolveAction||kr},this.$=r.anyAction||"manage",this.A=r.anySubjectType||"all",this.m=e,this.M=!!r.detectSubjectType,this.j=r.detectSubjectType||Pt,this.v(e)}get rules(){return this.m}detectSubjectType(e){return pe(e)?e:e?this.j(e):this.A}update(e){let r={rules:e,ability:this,target:this};return this._("update",r),this.m=e,this.v(e),this._("updated",r),this}v(e){let r=new Map,n;for(let s=e.length-1;s>=0;s--){let o=e.length-s-1,i=new et(e[s],this.p,o),c=Xe(i.action),l=Xe(i.subject||this.A);!this.h&&i.fields&&(this.h=!0);for(let u=0;u<l.length;u++){let g=de(r,l[u],Rt);n===void 0&&(n=typeof l[u]),typeof l[u]!==n&&n!=="mixed"&&(n="mixed");for(let v=0;v<c.length;v++)de(g,c[v],_t).rules.push(i)}}if(this.l=r,n!=="mixed"&&!this.M){let s=Mt[n]||Mt.string;this.j=s}}possibleRulesFor(e,r=this.A){if(!pe(r))throw new Error('"possibleRulesFor" accepts only subject types (i.e., string or class) as the 2nd parameter');let n=de(this.l,r,Rt),s=de(n,e,_t);if(s.merged)return s.rules;let o=e!==this.$&&n.has(this.$)?n.get(this.$).rules:void 0,i=St(s.rules,o);return r!==this.A&&(i=St(i,this.possibleRulesFor(e,this.A))),s.rules=i,s.merged=!0,i}rulesFor(e,r,n){let s=this.possibleRulesFor(e,r);if(n&&typeof n!="string")throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");return this.h?Tr(s,o=>o.matchesField(n)):s}actionsFor(e){if(!pe(e))throw new Error('"actionsFor" accepts only subject types (i.e., string or class) as a parameter');let r=new Set,n=this.l.get(e);n&&Array.from(n.keys()).forEach(o=>r.add(o));let s=e!==this.A?this.l.get(this.A):void 0;return s&&Array.from(s.keys()).forEach(o=>r.add(o)),Array.from(r)}on(e,r){this.F=this.F||new Map;let n=this.F,s=n.get(e)||null,o=Ur(r,s);return n.set(e,o),()=>{let i=n.get(e);!o.next&&!o.prev&&i===o?n.delete(e):o===i&&n.set(e,o.prev),Lr(o)}}_(e,r){if(!this.F)return;let n=this.F.get(e)||null,s=[];for(;n!==null;)s.push(n.value),n=n.prev;for(let o=0;o<s.length;o++)s[o](r)}},rt=class extends tt{can(e,r,n){let s=this.relevantRuleFor(e,r,n);return!!s&&!s.inverted}relevantRuleFor(e,r,n){let s=this.detectSubjectType(r),o=this.rulesFor(e,s,n);for(let i=0,c=o.length;i<c;i++)if(o[i].matchesConditions(r))return o[i];return null}cannot(e,r,n){return!this.can(e,r,n)}},Br={$eq:ae,$ne:Re,$lt:Se,$lte:_e,$gt:H,$gte:ie,$in:Z,$nin:Fe,$all:Me,$size:Ne,$regex:De,$options:ke,$elemMatch:Ie,$exists:Ce},qr={eq:ue,ne:qe,lt:Ve,lte:Ge,gt:ze,gte:Ye,in:Q,nin:Ze,all:He,size:Je,regex:Ke,elemMatch:Qe,exists:We,and:Be};var Gr=fe(Br,qr),Vr=/[-/\\^$+?.()|[\]{}]/g,zr=/\.?\*+\.?/g,Yr=/\*+/,Wr=/\./g;function Jr(t,e,r){let n=r[0]==="*"||t[0]==="."&&t[t.length-1]==="."?"+":"*",s=t.indexOf("**")===-1?"[^.]":".",o=t.replace(Wr,"\\$&").replace(Yr,s+n);return e+t.length===r.length?`(?:${o})?`:o}function Kr(t,e,r){return t==="."&&(r[e-1]==="*"||r[e+1]==="*")?t:`\\${t}`}function Zr(t){let e=t.map(n=>n.replace(Vr,Kr).replace(zr,Jr)),r=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${r}$`)}var Hr=t=>{let e;return r=>(typeof e>"u"&&(e=t.every(n=>n.indexOf("*")===-1)?null:Zr(t)),e===null?t.indexOf(r)!==-1:e.test(r))};function Ut(t=[],e={}){return new rt(t,Object.assign({conditionsMatcher:Gr,fieldMatcher:Hr},e))}var Qr=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`,Lt=function(e){this.message=e};Lt.prototype=Object.create(Error.prototype);var nt=class extends Lt{static setDefaultMessage(e){this.P=typeof e=="string"?()=>e:e}static from(e){return new this(e)}constructor(e){super(""),this.ability=e,typeof Error.captureStackTrace=="function"&&(this.name="ForbiddenError",Error.captureStackTrace(this,this.constructor))}setMessage(e){return this.message=e,this}throwUnlessCan(e,r,n){let s=this.unlessCan(e,r,n);if(s)throw s}unlessCan(e,r,n){let s=this.ability.relevantRuleFor(e,r,n);if(s&&!s.inverted)return;this.action=e,this.subject=r,this.subjectType=Dr(this.ability.detectSubjectType(r)),this.field=n;let o=s?s.reason:"";return this.message=this.message||o||this.constructor.P(this),this}};nt.P=Qr;var Dn=Object.freeze({__proto__:null});function st(t,e,r){if(t==null)return t;if(typeof t=="string"){if(t.indexOf("$principal.")!==0)return t;let s=t.slice(11).split(".").reduce((o,i)=>o==null?o:o[i],e);return s==null&&(r.unresolved=!0),s}if(Array.isArray(t))return t.map(n=>st(n,e,r));if(typeof t=="object"){let n={};for(let s of Object.keys(t))n[s]=st(t[s],e,r);return n}return t}function he(t,e){let r={unresolved:!1};return{conditions:st(t,e,r),unresolved:r.unresolved}}function Bt(t,e){return he(t,e).conditions}function q(t,e){let r=V(t,e),n=[];for(let s of e.rules){if(r.indexOf(s.subject)===-1)continue;let o={action:s.actions,subject:s.resource};if(s.where){let{conditions:i,unresolved:c}=he(s.where,t);if(c)continue;o.conditions=i}n.push(o)}return n}function ot(t){return Ut(Array.isArray(t)?t:[])}function me(t,e){return ot(q(t,e))}function j(t,e,r,n){return n==null?t.can(e,r):t.can(e,kt(r,Object.assign({},n)))}var C={ALL:"all",NONE:"none",FIELDS:"fields",AMBIGUOUS:"ambiguous"},qt={$in:"in",$nin:"nin",$ne:"ne",$gt:"gt",$gte:"gte",$lt:"lt",$lte:"lte"};function Xr(t){let e=[];for(let r of Object.keys(t)){let n=t[r];if(n===null||typeof n!="object"||Array.isArray(n)){e.push({field:r,op:"eq",value:n});continue}let s=Object.keys(n);if(s.length!==1||!qt[s[0]])return null;e.push({field:r,op:qt[s[0]],value:n[s[0]]})}return e}var en=(t,e)=>t==="manage"||t===e||Array.isArray(t)&&(t.indexOf(e)!==-1||t.indexOf("manage")!==-1),tn=(t,e)=>t==="all"||t===e;function ye(t,e,r,n){let s=q(t,e).filter(i=>en(i.action,r)&&tn(i.subject,n));if(s.length===0)return{scope:C.NONE,clauses:[]};if(s.some(i=>!i.conditions))return{scope:C.ALL,clauses:[]};if(s.length>1)return{scope:C.AMBIGUOUS,clauses:[]};let o=Xr(s[0].conditions);return o?{scope:C.FIELDS,clauses:o}:{scope:C.AMBIGUOUS,clauses:[]}}function be(t,e){let r=t;for(let n of e)n.op==="in"?r=r.hasSome(n.field,n.value):n.op==="nin"?r=r.not(r.hasSome(n.field,n.value)):r=r[n.op](n.field,n.value);return r}var it=/export\s+const\s+([A-Za-z0-9_$]+)\s*=\s*webMethod\s*\(\s*Permissions\s*\.\s*([A-Za-z0-9_$]+)/g,rn=[[/export\s*{\s*[A-Za-z0-9_$,\s]+}/,"export { x } \u2014 the call and the export must be one statement"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*Permissions\s*\[/,"Permissions['X'] \u2014 the property must be dotted and literal"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*[A-Za-z0-9_$]+\s*\(/,"a computed permission \u2014 it must be written out as Permissions.LEVEL"]];function at(t){let e={},r=String(t||"");it.lastIndex=0;let n=it.exec(r);for(;n;)e[n[1]]=n[2],n=it.exec(r);return e}function ct(t,e,r){let n=r||{},s=e&&e.api||{},o=at(t),i=String(t||""),c=[],l=[];for(let h of Object.keys(o)){let M=s[h];M?M.permission!==o[h]&&c.push({name:h,declared:M.permission,written:o[h]}):l.push({name:h,gate:o[h]})}let u=n.complete?Object.keys(s).filter(h=>!(h in o)):[],g=[];for(let[h,M]of rn)h.test(i)&&g.push(M);return{ok:c.length+l.length+u.length+g.length===0,found:o,mismatched:c,undeclared:l,missing:u,suspect:g}}function Gt(t,e,r){let n=ct(t,e,r);if(n.ok)return!0;let s=[];for(let o of n.mismatched)s.push(o.name+": policy says "+o.declared+", the export says "+o.written);for(let o of n.undeclared)s.push(o.name+": gated "+o.gate+" but missing from policy.api");for(let o of n.missing)s.push(o+": declared in policy.api but not exported here");for(let o of n.suspect)s.push("unreachable export shape \u2014 "+o);throw new Error(`wix-access: web-method gates do not match the policy:
|
|
2
2
|
`+s.join(`
|
|
3
|
-
`))}function
|
|
3
|
+
`))}function Vt(t,e){let r=e&&e.api||{},n=t||{},s={},o=[];for(let i of Object.keys(n)){let c=n[i],l=r[i];if(!l){o.push(i);continue}if(typeof c!="function"){o.push(i+" (not a function: "+typeof c+")");continue}try{c.permission=l.permission,s[i]=l.permission}catch(u){o.push(i+" (could not stamp: "+String(u&&u.message)+")")}}if(o.length)throw new Error("wix-access: applyGates could not gate: "+o.join(", ")+". Every exported web method must be declared in policy.api.");return s}var ut="0.5.1";var lt=[{action:"read",type:"Booking",object:{customerId:"m-1"}},{action:"read",type:"Booking",object:{customerId:"m-2"}},{action:"cancel",type:"Booking",object:{customerId:"m-1"}},{action:"delete",type:"Booking",object:{customerId:"m-1"}},{action:"manage",type:"Vendor",object:{_id:"v-1"}}];function zt(t){return lt.map(e=>({action:e.action,type:e.type,object:e.object,can:j(t,e.action,e.type,e.object)}))}function Yt(t,e){let{wixUsers:r,currentMember:n}=t,s=e&&e.enrich||null,o=e&&e.onError||null;return async function(){let c=null,l=!1,u=!1;try{c=r.currentUser&&r.currentUser.id||null,l=!!(r.currentUser&&r.currentUser.loggedIn)}catch(h){u=!0,o&&o("resolveCaller.id",h)}let g=[];if(c)try{g=await n.getRoles()}catch(h){u=!0,o&&o("resolveCaller.roles",h)}let v=W({kind:c?D.MEMBER:D.VISITOR,memberId:c,roles:g,unverified:u});if(v.loggedIn=l,s)try{let h=await s(v);h&&typeof h=="object"&&(v.domain=h)}catch(h){v.unverified=!0,o&&o("resolveCaller.enrich",h)}return v}}var nn="Admin";function Wt(t,e,r){let n=r.resolveCaller,s=r.abilityFor,o=r.audit||null;function i(l,u,g,v){return o&&o({event:"access.denied",action:l,code:u,caller:g?g.memberId:null,detail:v||null}),I(u,l)}function c(l,u,g){return u==="Anyone"?null:g.memberId?u==="Admin"&&!te(g,nn)?i(l,w.FORBIDDEN,g,{gate:u}):null:i(l,w.UNAUTHENTICATED,g)}return function(u,g,v){let h=t.api&&t.api[u]||null;if(!h)throw new Error('wix-access: web method "'+u+'" is not declared in policy.api. Add it, or the gate it runs behind is undocumented.');let M=v||{},R=h.permission,X=h.ability||null,a=M.strip||[];return async function(...f){let p=await n();if(p.unverified)return i(u,w.UNVERIFIED,p);let O=c(u,R,p);if(O)return O;let m=f.map(d=>{if(!d||typeof d!="object"||Array.isArray(d))return d;let x=Object.assign({},d);for(let A of a)delete x[A];return x}),y=null;if(X){let[d,x]=X;if(M.load){if(y=await M.load(...m),!y)return i(u,w.NOT_FOUND,p);if(!j(s(p),d,x,y))return N(u)}else if(!j(s(p),d,x))return i(u,w.FORBIDDEN,p)}return g({principal:p,subject:y},...m)}}}function Jt(t,e){let r=Object.keys(t&&t.api||{}),n=e.filter(s=>r.indexOf(s)===-1);if(n.length)throw new Error("wix-access: web methods missing from policy.api: "+n.join(", "));return!0}var Kt=100,sn=100,F="assignOwner";function Zt(t,e,r){let{items:n,auth:s}=e,o=r.abilityFor,i=r.audit||null,c=r.onError||null;function l(a){if(i)try{i(a)}catch(f){c&&c("audit",f)}}let u={query:(...a)=>s.elevate(n.query)(...a),get:(...a)=>s.elevate(n.get)(...a),insert:(...a)=>s.elevate(n.insert)(...a),update:(...a)=>s.elevate(n.update)(...a),remove:(...a)=>s.elevate(n.remove)(...a)},g=r.namespace||null,v=a=>{let f=t.collections||{};return f[a]?f[a]:g&&typeof a=="string"&&a.indexOf(g)===0&&f[a.slice(g.length)]||null},h=a=>{let f=v(a);return f&&f.owner?f.owner:null},M=a=>{let f=v(a);return f&&f.actor?f.actor:null},R=a=>{let f=v(a);return f&&f.resource||a};async function X(a,f){let p=[],O=await a.limit(Math.min(f||Kt,Kt)).find(),m=0;for(;O;){for(let y of O.items)p.push(y);if(f&&p.length>=f)return p.slice(0,f);if(!O.hasNext||!O.hasNext()||++m>=sn)break;O=await O.next()}return p}return{async query(a,f){let{principal:p,action:O="read",limit:m}=f,y=R(a),d=ye(p,t,O,y);if(d.scope===C.NONE)return{ok:!0,data:[],scope:d.scope};let x=u.query(a);d.scope===C.FIELDS&&(x=be(x,d.clauses));let A=await X(x,d.scope===C.AMBIGUOUS?null:m);if(d.scope!==C.AMBIGUOUS)return{ok:!0,data:A,scope:d.scope};let E=o(p),$=A.filter(S=>j(E,O,y,S));return{ok:!0,data:m?$.slice(0,m):$,scope:d.scope}},async get(a,f,p){let{principal:O,action:m="read"}=p,y=R(a),d=await u.get(a,f);return d?j(o(O),m,y,d)?{ok:!0,data:d}:N(m):N(m)},async insert(a,f,p){let{principal:O,action:m="create",onBehalfOf:y,system:d=!1}=p,x=R(a),A=h(a),E=M(a),$=O.memberId||null;if(y!==void 0){if(!A)return I(w.INVALID_ARGUMENT,m,{reason:a+" declares no owner field"});if(typeof y!="string"||!y)return I(w.INVALID_ARGUMENT,m,{reason:"onBehalfOf must be a member id"})}else if(d)return I(w.INVALID_ARGUMENT,m,{reason:"system is only meaningful with onBehalfOf"});let S=Object.assign({},f),G=y!==void 0?y:$,Y=G!==$;A&&(S[A]=G),E&&(S[E]=$);let dt=o(O);if(Y&&!d&&!j(dt,F,x,S))return l({event:"access.denied",action:F,code:w.FORBIDDEN,caller:$,detail:{collection:a,owner:G}}),I(w.FORBIDDEN,F);if(!j(dt,m,x,S))return I(w.FORBIDDEN,m);let ge=await u.insert(a,S);return Y&&l({event:"access.onBehalf",action:m,caller:$,owner:G,system:d,collection:a,id:ge&&ge._id}),{ok:!0,data:ge}},async update(a,f,p,O){let{principal:m,action:y="update"}=O;if(O.onBehalfOf!==void 0)return I(w.INVALID_ARGUMENT,y,{reason:"update never changes the owner; use transfer"});let d=R(a),x=await u.get(a,f);if(!x)return N(y);if(!j(o(m),y,d,x))return N(y);let A=h(a),E=M(a),$=Object.assign({},x,p,{_id:f});return A&&($[A]=x[A]),E&&($[E]=x[E]),{ok:!0,data:await u.update(a,$)}},async transfer(a,f,p,O){let{principal:m,system:y=!1}=O,d=R(a),x=h(a),A=m.memberId||null;if(!x)return I(w.INVALID_ARGUMENT,F,{reason:a+" declares no owner field"});if(p!==null&&(typeof p!="string"||!p))return I(w.INVALID_ARGUMENT,F,{reason:"newOwner must be a member id or null"});let E=await u.get(a,f);if(!E)return N(F);let $=Object.assign({},E,{_id:f,[x]:p});if(!y){let Y=o(m);if(!j(Y,F,d,E)||!j(Y,F,d,$))return l({event:"access.denied",action:F,code:w.FORBIDDEN,caller:A,detail:{collection:a,id:f}}),N(F)}let S=E[x]===void 0?null:E[x];if(S===p)return{ok:!0,data:E};let G=await u.update(a,$);return l({event:"access.transfer",action:F,caller:A,from:S,owner:p,system:y,collection:a,id:f}),{ok:!0,data:G}},async remove(a,f,p){let{principal:O,action:m="delete"}=p,y=R(a),d=await u.get(a,f);return d?j(o(O),m,y,d)?{ok:!0,data:await u.remove(a,f)}:N(m):N(m)}}}function Ht(t,e,r){re(t);let n=r||{};if(n.namespace!==void 0&&(typeof n.namespace!="string"||!n.namespace))throw new Error('wix-access: options.namespace must be a non-empty string, e.g. "@scope/app/"');let s=Yt(e,{enrich:n.enrich,onError:n.onError}),o=async()=>{let u=await s();return u.subjects=V(u,t),u},i=u=>me(u,t),c=Wt(t,e,{resolveCaller:o,abilityFor:i,audit:n.audit}),l=Zt(t,e,{abilityFor:i,audit:n.audit,onError:n.onError,namespace:n.namespace});return{policy:t,resolveCaller:o,abilityFor:i,guard:c,db:l,gateFor:u=>{let g=t.api&&t.api[u]||null;return g?g.permission:null},rulesForCaller:async()=>q(await o(),t)}}function on(t,e){let r=e||{},n=Object.assign({wixUsers:Qt.default,currentMember:ft.currentMember,items:Xt.items,auth:er.auth},r.deps||{});return Ht(t,n,r)}function an(){return{ok:!0,side:"backend",version:ut}}async function cn(){try{let t=await ft.currentMember.getMember();return t&&t._id||null}catch{return null}}0&&(module.exports={ASSIGN_OWNER,CASES,CODES,KIND,PACKAGE_VERSION,PolicyError,SCOPE,WHEN,abilityFor,abilityFromRules,anonymous,applyClauses,applyGates,assertDeclared,assertGates,backendMemberId,backendPing,can,caseTable,createAccess,createPrincipal,deny,denyOpaque,filterFor,hasRole,isDenial,normaliseRoles,ok,parseGates,permissionFor,resolvePlaceholders,resolveSubjects,resolveWhere,rulesFor,validatePolicy,verifyGates});
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@liquisio/wix-access",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.1",
|
|
4
4
|
"description": "One authorization policy for Wix, serving the web-method gate, backend, database and page code. Built against measured platform behaviour.",
|
|
5
5
|
"main": "./index.js",
|
|
6
6
|
"types": "./types.d.ts",
|
|
@@ -8,12 +8,22 @@
|
|
|
8
8
|
"build": "node build.mjs",
|
|
9
9
|
"test": "node --test test/*.test.mjs",
|
|
10
10
|
"verify": "npm run build && npm test",
|
|
11
|
-
"prepublishOnly": "npm run verify"
|
|
11
|
+
"prepublishOnly": "npm run verify",
|
|
12
|
+
"stamp": "node ../scripts/stamp.mjs"
|
|
12
13
|
},
|
|
13
14
|
"exports": {
|
|
14
|
-
".": {
|
|
15
|
-
|
|
16
|
-
|
|
15
|
+
".": {
|
|
16
|
+
"types": "./types.d.ts",
|
|
17
|
+
"default": "./index.js"
|
|
18
|
+
},
|
|
19
|
+
"./backend": {
|
|
20
|
+
"types": "./backend.d.ts",
|
|
21
|
+
"default": "./backend.js"
|
|
22
|
+
},
|
|
23
|
+
"./public": {
|
|
24
|
+
"types": "./public.d.ts",
|
|
25
|
+
"default": "./public.js"
|
|
26
|
+
}
|
|
17
27
|
},
|
|
18
28
|
"files": [
|
|
19
29
|
"index.js",
|
|
@@ -24,11 +34,23 @@
|
|
|
24
34
|
"public.d.ts",
|
|
25
35
|
"README.md"
|
|
26
36
|
],
|
|
27
|
-
"engines": {
|
|
28
|
-
|
|
37
|
+
"engines": {
|
|
38
|
+
"node": ">=18"
|
|
39
|
+
},
|
|
40
|
+
"keywords": [
|
|
41
|
+
"wix",
|
|
42
|
+
"velo",
|
|
43
|
+
"blocks",
|
|
44
|
+
"authorization",
|
|
45
|
+
"permissions",
|
|
46
|
+
"access-control",
|
|
47
|
+
"casl"
|
|
48
|
+
],
|
|
29
49
|
"author": "Varun Dev <hello@liquis.io>",
|
|
30
50
|
"license": "MIT",
|
|
31
|
-
"publishConfig": {
|
|
51
|
+
"publishConfig": {
|
|
52
|
+
"access": "public"
|
|
53
|
+
},
|
|
32
54
|
"devDependencies": {
|
|
33
55
|
"@casl/ability": "^6.7.3",
|
|
34
56
|
"esbuild": "^0.27.7"
|
package/public.js
CHANGED
|
@@ -1,3 +1,3 @@
|
|
|
1
|
-
var X=Object.defineProperty;var _t=Object.getOwnPropertyDescriptor;var Pt=Object.getOwnPropertyNames;var Tt=Object.prototype.hasOwnProperty;var kt=(t,e)=>{for(var s in e)X(t,s,{get:e[s],enumerable:!0})},Dt=(t,e,s,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Pt(e))!Tt.call(t,r)&&r!==s&&X(t,r,{get:()=>e[r],enumerable:!(n=_t(e,r))||n.enumerable});return t};var Ut=t=>Dt(X({},"__esModule",{value:!0}),t);var _s={};kt(_s,{CASES:()=>Ye,CODES:()=>E,KIND:()=>F,PACKAGE_VERSION:()=>Ge,PolicyError:()=>x,SCOPE:()=>$,WHEN:()=>y,abilityFor:()=>$t,abilityFromRules:()=>N,anonymous:()=>Ke,applyClauses:()=>It,applyGates:()=>Ft,assertGates:()=>Nt,can:()=>w,caseTable:()=>Mt,createAccess:()=>Ct,createPrincipal:()=>se,deny:()=>ee,denyOpaque:()=>He,filterFor:()=>Et,frontendRoleTitles:()=>Rs,hasRole:()=>Qe,isDenial:()=>k,normaliseRoles:()=>te,ok:()=>Ze,parseGates:()=>Be,permissionFor:()=>et,publicPing:()=>Cs,resolvePlaceholders:()=>wt,resolveSubjects:()=>D,resolveWhere:()=>K,rulesFor:()=>P,validatePolicy:()=>Xe,verifyGates:()=>Ve});module.exports=Ut(_s);var Rt=require("wix-members-frontend");var E={FORBIDDEN:"FORBIDDEN",UNAUTHENTICATED:"UNAUTHENTICATED",UNVERIFIED:"UNVERIFIED",NOT_FOUND:"NOT_FOUND",INVALID_POLICY:"INVALID_POLICY",INVALID_ARGUMENT:"INVALID_ARGUMENT"},x=class extends Error{constructor(e){super(e),this.name="PolicyError",this.code=E.INVALID_POLICY}};function Ze(t){return{ok:!0,data:t===void 0?null:t}}function ee(t,e,s){let n={ok:!1,code:t||E.FORBIDDEN};return e&&(n.action=e),s&&(n.detail=s),n}var k=t=>!!t&&t.ok===!1;function He(t){return ee(E.NOT_FOUND,t)}var F={VISITOR:"visitor",MEMBER:"member",CAPABILITY:"capability",SERVICE:"service"};function te(t){if(!Array.isArray(t))return[];let e=[];for(let s of t){if(typeof s=="string"){e.push(s);continue}if(!s||typeof s!="object")continue;let n=s.title||s.name||s.roleKey;n&&e.push(n)}return e}function se(t){let e=t||{},s=e.memberId||null,n=te(e.roles);return{kind:e.kind||(s?F.MEMBER:F.VISITOR),memberId:s,roles:n,subjects:Array.isArray(e.subjects)?e.subjects.slice():[],domain:e.domain&&typeof e.domain=="object"?e.domain:{},unverified:!!e.unverified}}var Ke=()=>se({kind:F.VISITOR}),Qe=(t,e)=>t.roles.indexOf(e)!==-1;var y={ANYONE:"anyone",ANONYMOUS:"anonymous",MEMBER:"member"},m=t=>!!t&&typeof t=="object"&&!Array.isArray(t),Lt=t=>Array.isArray(t)?t:[t];function f(t,e){throw new x("policy"+t+": "+e)}function qt(t,e){let s=".subjects."+t;m(e)||f(s,"must be an object");let r=["when","role","domain"].filter(o=>e[o]!==void 0);if(r.length===0&&f(s,'needs exactly one of when/role/domain \u2014 "{}" is ambiguous between a visitor and a member'),r.length>1&&f(s,"has "+r.join(" and ")+"; use exactly one"),e.when!==void 0){let o=[y.ANYONE,y.ANONYMOUS,y.MEMBER];o.indexOf(e.when)===-1&&f(s+".when","must be one of "+o.join(", ")+" (got "+JSON.stringify(e.when)+")")}e.role!==void 0&&typeof e.role!="string"&&f(s+".role","must be a string"),e.domain!==void 0&&typeof e.domain!="string"&&f(s+".domain","must be a string")}function zt(t,e,s){let n=".rules["+e+"]";m(t)||f(n,"must be an object"),typeof t.subject!="string"&&f(n+".subject","must be a string"),s.indexOf(t.subject)===-1&&f(n+".subject",'"'+t.subject+'" is not declared in policy.subjects'),t.actions===void 0&&f(n+".actions","is required");for(let r of Lt(t.actions))typeof r!="string"&&f(n+".actions","must be a string or an array of strings");typeof t.resource!="string"&&f(n+".resource","must be a string"),t.where!==void 0&&!m(t.where)&&f(n+".where","must be an object")}var We=["Anyone","SiteMember","Admin"];function Bt(t,e,s){let n=".api."+t;m(e)||f(n,"must be an object"),We.indexOf(e.permission)===-1&&f(n+".permission","must be one of "+We.join(", ")+" (got "+JSON.stringify(e.permission)+")"),e.ability!==void 0&&((!Array.isArray(e.ability)||e.ability.length!==2)&&f(n+".ability","must be [action, resource]"),(typeof e.ability[0]!="string"||typeof e.ability[1]!="string")&&f(n+".ability","both entries must be strings")),e.subject!==void 0&&s.indexOf(e.subject)===-1&&f(n+".subject",'"'+e.subject+'" is not declared in policy.subjects')}function Xe(t){if(!m(t))throw new x("policy must be an object");m(t.subjects)||f(".subjects","is required and must be an object");let e=Object.keys(t.subjects);e.length===0&&f(".subjects","declares no subjects");for(let s of e)qt(s,t.subjects[s]);if(Array.isArray(t.rules)||f(".rules","is required and must be an array"),t.rules.forEach((s,n)=>zt(s,n,e)),t.api!==void 0){m(t.api)||f(".api","must be an object");for(let s of Object.keys(t.api))Bt(s,t.api[s],e)}return t.collections!==void 0&&!m(t.collections)&&f(".collections","must be an object"),t}function D(t,e){let s=new Set(t.subjects||[]);for(let n of Object.keys(e.subjects)){let r=e.subjects[n];(r.when===y.ANYONE||r.when===y.ANONYMOUS&&!t.memberId||r.when===y.MEMBER&&t.memberId||r.role!==void 0&&t.roles.indexOf(r.role)!==-1||r.domain!==void 0&&t.domain[r.domain])&&s.add(n)}return Array.from(s)}function et(t,e){let s=t.api&&t.api[e];return s?s.permission:null}var U=class{constructor(e,s){this.operator=e,this.value=s,Object.defineProperty(this,"t",{writable:!0})}get notes(){return this.t}addNote(e){this.t=this.t||[],this.t.push(e)}},M=class extends U{},O=class extends M{constructor(e,s){if(!Array.isArray(s))throw new Error(`"${e}" operator expects to receive an array of conditions`);super(e,s)}},b="__itself__",j=class extends U{constructor(e,s,n){super(e,n),this.field=s}},ie=new M("__null__",null),oe=Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);function Vt(t,e){return e instanceof O&&e.operator===t}function ae(t,e){return e.length===1?e[0]:new O(t,(function s(n,r,o){let i=o||[];for(let a=0,u=r.length;a<u;a++){let l=r[a];Vt(n,l)?s(n,l.value,i):i.push(l)}return i})(t,e))}var Gt=t=>t,tt=()=>Object.create(null),st=Object.defineProperty(tt(),"__@type@__",{value:"ignore value"});function Yt(t,e,s=!1){if(!t||t&&t.constructor!==Object)return!1;for(let n in t)if(oe(t,n)&&oe(e,n)&&(!s||t[n]!==st))return!0;return!1}function Jt(t){let e=[];for(let s in t)oe(t,s)&&t[s]!==st&&e.push(s);return e}function ne(t,e){e!==ie&&t.push(e)}var ce=t=>ae("and",t);var L={compound(t,e,s){let n=(Array.isArray(e)?e:[e]).map(r=>s.parse(r));return new O(t.name,n)},field:(t,e,s)=>new j(t.name,s.field,e),document:(t,e)=>new M(t.name,e)},S=class{constructor(e,s=tt()){this.o=void 0,this.s=void 0,this.i=void 0,this.u=void 0,this.h=void 0,this.parse=this.parse.bind(this),this.u={operatorToConditionName:s.operatorToConditionName||Gt,defaultOperatorName:s.defaultOperatorName||"eq",mergeFinalConditions:s.mergeFinalConditions||ce},this.o=Object.keys(e).reduce((n,r)=>(n[r]=Object.assign({name:this.u.operatorToConditionName(r)},e[r]),n),{}),this.s=Object.assign({},s.fieldContext,{field:"",query:{},parse:this.parse,hasOperators:n=>Yt(n,this.o,s.useIgnoreValue)}),this.i=Object.assign({},s.documentContext,{parse:this.parse,query:{}}),this.h=s.useIgnoreValue?Jt:Object.keys}setParse(e){this.parse=e,this.s.parse=e,this.i.parse=e}parseField(e,s,n,r){let o=this.o[s];if(!o)throw new Error(`Unsupported operator "${s}"`);if(o.type!=="field")throw new Error(`Unexpected ${o.type} operator "${s}" at field level`);return this.s.field=e,this.s.query=r,this.parseInstruction(o,n,this.s)}parseInstruction(e,s,n){return typeof e.validate=="function"&&e.validate(e,s),(e.parse||L[e.type])(e,s,n)}parseFieldOperators(e,s){let n=[],r=this.h(s);for(let o=0,i=r.length;o<i;o++){let a=r[o];if(!this.o[a])throw new Error(`Field query for "${e}" may contain only operators or a plain object as a value`);ne(n,this.parseField(e,a,s[a],s))}return n}parse(e){let s=[],n=this.h(e);this.i.query=e;for(let r=0,o=n.length;r<o;r++){let i=n[r],a=e[i],u=this.o[i];if(u){if(u.type!=="document"&&u.type!=="compound")throw new Error(`Cannot use parsing instruction for operator "${i}" in "document" context as it is supposed to be used in "${u.type}" context`);ne(s,this.parseInstruction(u,a,this.i))}else this.s.hasOperators(a)?s.push(...this.parseFieldOperators(i,a)):ne(s,this.parseField(i,this.u.defaultOperatorName,a,e))}return this.u.mergeFinalConditions(s)}};function re(t,e){let s=t[e];if(typeof s!="function")throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return s}function Zt(t){return t.operator}function nt(t,e){let s=e,n=s&&s.getInterpreterName||Zt,r;switch(s?s.numberOfArguments:0){case 1:r=i=>{let a=n(i,s);return re(t,a)(i,o)};break;case 3:r=(i,a,u)=>{let l=n(i,s);return re(t,l)(i,a,u,o)};break;default:r=(i,a)=>{let u=n(i,s);return re(t,u)(i,a,o)}}let o=Object.assign({},s,{interpret:r});return o.interpret}function rt(t,e){return(s,...n)=>{let r=t(s,...n),o=e.bind(null,r);return o.ast=r,o}}var zs=S.prototype.parseInstruction;function ot(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function it(t,e){if(ot(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}var ue=t=>(e,s)=>{if(typeof s!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},at={type:"compound",validate:it,parse(t,e,{parse:s}){let n=e.map(r=>s(r));return ae(t.name,n)}},Ht=at,Kt={type:"compound",validate:it},Qt={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,e,s){let n=e instanceof RegExp?new j("regex",s.field,e):s.parse(e,s);return new O(t.name,[n])}},le={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:s,field:n,hasOperators:r}){let o=r(e)?s(e,{field:b}):s(e);return new j(t.name,n,o)}},fe={type:"field",validate:ue("number")},C={type:"field",validate:ot},pe=C,de=C,Wt={type:"field",validate(t,e){if(!Array.isArray(e)||e.length!==2)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},he={type:"field",validate:ue("boolean")},z={type:"field",validate:function(t,e){if(!(typeof e=="string"||typeof e=="number"||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},R=z,me=R,ye=R,B={type:"field"},be=B,ge={type:"field",validate(t,e){if(!(e instanceof RegExp)&&typeof e!="string")throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,s){let n=typeof e=="string"?new RegExp(e,s.query.$options||""):e;return new j(t.name,s.field,n)}},xe={type:"field",parse:()=>ie},Xt={type:"document",validate:ue("function")},es=Object.freeze({__proto__:null,$and:at,$or:Ht,$nor:Kt,$not:Qt,$elemMatch:le,$size:fe,$in:C,$nin:pe,$all:de,$mod:Wt,$exists:he,$gte:z,$gt:R,$lt:me,$lte:ye,$eq:B,$ne:be,$regex:ge,$options:xe,$where:Xt}),q=class extends S{constructor(e){super(e,{defaultOperatorName:"$eq",operatorToConditionName:s=>s.slice(1)})}parse(e,s){return s&&s.field?ce(this.parseFieldOperators(s.field,e)):super.parse(e)}},V=es;function Oe(t,e,s){for(let n=0,r=t.length;n<r;n++)if(s(t[n],e)===0)return!0;return!1}function je(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function ct(t,e,s){if(!je(t,e))return s(t,e);let n=[];for(let r=0;r<t.length;r++){let o=s(t[r],e);o!==void 0&&(n=n.concat(o))}return n}function v(t){return(e,s,n)=>{let r=n.get(s,e.field);return Array.isArray(r)?r.some(o=>t(e,o,n)):t(e,r,n)}}var ts=Object.hasOwn||Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty),ss=(t,e)=>t[e];function ut(t,e,s){let n=e.lastIndexOf(".");return n===-1?[t,e]:[s(t,e.slice(0,n)),e.slice(n+1)]}function ns(t,e,s=ss){if(e===b)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return(function(n,r,o){if(r.indexOf(".")===-1)return ct(n,r,o);let i=r.split("."),a=n;for(let u=0,l=i.length;u<l;u++)if(a=ct(a,i[u],o),!a||typeof a!="object")return u<l-1?void 0:a;return a})(t,e,s)}function ve(t,e){return t===e?0:t>e?1:-1}function we(t,e={}){return nt(t,Object.assign({get:ns,compare:ve},e))}var lt=(t,e,{interpret:s})=>t.value.some(n=>s(n,e)),rs=(t,e,s)=>!lt(t,e,s),$e=(t,e,{interpret:s})=>t.value.every(n=>s(n,e)),os=(t,e,{interpret:s})=>!s(t.value[0],e),G=(t,e,{compare:s,get:n})=>{let r=n(e,t.field);return Array.isArray(r)&&!Array.isArray(t.value)?Oe(r,t.value,s):s(r,t.value)===0},Ae=(t,e,s)=>!G(t,e,s),Ee=v((t,e,s)=>{let n=s.compare(e,t.value);return n===0||n===-1}),Ie=v((t,e,s)=>s.compare(e,t.value)===-1),Ne=v((t,e,s)=>s.compare(e,t.value)===1),Fe=v((t,e,s)=>{let n=s.compare(e,t.value);return n===0||n===1}),Me=(t,e,{get:s})=>{if(t.field===b)return e!==void 0;let[n,r]=ut(e,t.field,s),o=i=>i==null?!!i===t.value:ts(i,r)===t.value;return je(n,r)?n.some(o):o(n)},is=v((t,e)=>typeof e=="number"&&e%t.value[0]===t.value[1]),Se=(t,e,{get:s})=>{let[n,r]=ut(e,t.field,s),o=i=>{let a=s(i,r);return Array.isArray(a)&&a.length===t.value};return t.field!==b&&je(n,r)?n.some(o):o(n)},Ce=v((t,e)=>typeof e=="string"&&t.value.test(e)),_=v((t,e,{compare:s})=>Oe(t.value,e,s)),Re=(t,e,s)=>!_(t,e,s),_e=(t,e,{compare:s,get:n})=>{let r=n(e,t.field);return Array.isArray(r)&&t.value.every(o=>Oe(r,o,s))},Pe=(t,e,{interpret:s,get:n})=>{let r=n(e,t.field);return Array.isArray(r)&&r.some(o=>s(t.value,o))},as=(t,e)=>t.value.call(e),cs=Object.freeze({__proto__:null,or:lt,nor:rs,and:$e,not:os,eq:G,ne:Ae,lte:Ee,lt:Ie,gt:Ne,gte:Fe,exists:Me,mod:is,size:Se,regex:Ce,within:_,nin:Re,all:_e,elemMatch:Pe,where:as}),Y=Object.assign({},cs,{in:_}),Zs=we(Y);function ft(t){return t===null||typeof t!="object"?t:t instanceof Date?t.getTime():t&&typeof t.toJSON=="function"?t.toJSON():t}var us=(t,e)=>ve(ft(t),ft(e));function J(t,e,s){let n=new q(t),r=we(e,Object.assign({compare:us},s));if(s&&s.forPrimitives){let o={field:b},i=n.parse;n.setParse(a=>i(a,o))}return rt(n.parse,r)}var Xs=J(V,Y),en=J(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},V,{$nor:Object.assign({},V.$nor,{type:"field",parse:L.compound})})),Y,{forPrimitives:!0});var bt=Object.hasOwn||((t,e)=>Object.prototype.hasOwnProperty.call(t,e));function Te(t){return Array.isArray(t)?t:[t]}var I="__caslSubjectType__";function gt(t,e){if(e){if(!bt(e,I))Object.defineProperty(e,I,{value:t});else if(t!==e[I])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[I]}`)}return e}var H=t=>{let e=typeof t;return e==="string"||e==="function"},xt=t=>t.modelName||t.name;function ls(t){return typeof t=="string"?t:xt(t)}function Ot(t){return bt(t,I)?t[I]:xt(t.constructor)}var pt={function:t=>t.constructor,string:Ot};function dt(t,e,s){for(let n=s;n<e.length;n++)t.push(e[n])}function ht(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let s=0,n=0,r=[];for(;s<t.length&&n<e.length;)t[s].priority<e[n].priority?(r.push(t[s]),s++):t[s].priority>e[n].priority?(r.push(e[n]),n++):(r.push(t[s]),s++,n++);return dt(r,t,s),dt(r,e,n),r}function Z(t,e,s){let n=t.get(e);return n||(n=s(),t.set(e,n)),n}var fs=t=>t;function ps(t,e){let s;for(let n=0;n<t.length;n++){let r=e(t[n]);s&&r&&s.push(t[n]),r||(s??(s=t.slice(0,n)))}return s||t}function ds(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var ke=class{constructor(e,s,n=0){ds(e,s),this.action=s.resolveAction(e.action),this.subject=e.subject,this.inverted=!!e.inverted,this.conditions=e.conditions,this.reason=e.reason,this.origin=e,this.fields=e.fields?Te(e.fields):void 0,this.priority=n,this.t=s}i(){return this.conditions&&!this.o&&(this.o=this.t.conditionsMatcher(this.conditions)),this.o}get ast(){let e=this.i();return e?e.ast:void 0}matchesConditions(e){return this.conditions?!e||H(e)?!this.inverted:this.i()(e):!0}matchesField(e){return this.fields?e?(this.u||(this.u=this.t.fieldMatcher(this.fields)),this.u(e)):!this.inverted:!0}};function hs(t,e){let s={value:t,prev:e,next:null};return e&&(e.next=s),s}function ms(t){t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next),t.next=t.prev=null}var mt=()=>({rules:[],merged:!1}),yt=()=>new Map,De=class{constructor(e=[],s={}){this.h=!1,this.l=new Map,this.p={conditionsMatcher:s.conditionsMatcher,fieldMatcher:s.fieldMatcher,resolveAction:s.resolveAction||fs},this.$=s.anyAction||"manage",this.A=s.anySubjectType||"all",this.m=e,this.M=!!s.detectSubjectType,this.j=s.detectSubjectType||Ot,this.v(e)}get rules(){return this.m}detectSubjectType(e){return H(e)?e:e?this.j(e):this.A}update(e){let s={rules:e,ability:this,target:this};return this._("update",s),this.m=e,this.v(e),this._("updated",s),this}v(e){let s=new Map,n;for(let r=e.length-1;r>=0;r--){let o=e.length-r-1,i=new ke(e[r],this.p,o),a=Te(i.action),u=Te(i.subject||this.A);!this.h&&i.fields&&(this.h=!0);for(let l=0;l<u.length;l++){let h=Z(s,u[l],yt);n===void 0&&(n=typeof u[l]),typeof u[l]!==n&&n!=="mixed"&&(n="mixed");for(let A=0;A<a.length;A++)Z(h,a[A],mt).rules.push(i)}}if(this.l=s,n!=="mixed"&&!this.M){let r=pt[n]||pt.string;this.j=r}}possibleRulesFor(e,s=this.A){if(!H(s))throw new Error('"possibleRulesFor" accepts only subject types (i.e., string or class) as the 2nd parameter');let n=Z(this.l,s,yt),r=Z(n,e,mt);if(r.merged)return r.rules;let o=e!==this.$&&n.has(this.$)?n.get(this.$).rules:void 0,i=ht(r.rules,o);return s!==this.A&&(i=ht(i,this.possibleRulesFor(e,this.A))),r.rules=i,r.merged=!0,i}rulesFor(e,s,n){let r=this.possibleRulesFor(e,s);if(n&&typeof n!="string")throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");return this.h?ps(r,o=>o.matchesField(n)):r}actionsFor(e){if(!H(e))throw new Error('"actionsFor" accepts only subject types (i.e., string or class) as a parameter');let s=new Set,n=this.l.get(e);n&&Array.from(n.keys()).forEach(o=>s.add(o));let r=e!==this.A?this.l.get(this.A):void 0;return r&&Array.from(r.keys()).forEach(o=>s.add(o)),Array.from(s)}on(e,s){this.F=this.F||new Map;let n=this.F,r=n.get(e)||null,o=hs(s,r);return n.set(e,o),()=>{let i=n.get(e);!o.next&&!o.prev&&i===o?n.delete(e):o===i&&n.set(e,o.prev),ms(o)}}_(e,s){if(!this.F)return;let n=this.F.get(e)||null,r=[];for(;n!==null;)r.push(n.value),n=n.prev;for(let o=0;o<r.length;o++)r[o](s)}},Ue=class extends De{can(e,s,n){let r=this.relevantRuleFor(e,s,n);return!!r&&!r.inverted}relevantRuleFor(e,s,n){let r=this.detectSubjectType(s),o=this.rulesFor(e,r,n);for(let i=0,a=o.length;i<a;i++)if(o[i].matchesConditions(s))return o[i];return null}cannot(e,s,n){return!this.can(e,s,n)}},ys={$eq:B,$ne:be,$lt:me,$lte:ye,$gt:R,$gte:z,$in:C,$nin:pe,$all:de,$size:fe,$regex:ge,$options:xe,$elemMatch:le,$exists:he},bs={eq:G,ne:Ae,lt:Ie,lte:Ee,gt:Ne,gte:Fe,in:_,nin:Re,all:_e,size:Se,regex:Ce,elemMatch:Pe,exists:Me,and:$e};var gs=J(ys,bs),xs=/[-/\\^$+?.()|[\]{}]/g,Os=/\.?\*+\.?/g,js=/\*+/,vs=/\./g;function ws(t,e,s){let n=s[0]==="*"||t[0]==="."&&t[t.length-1]==="."?"+":"*",r=t.indexOf("**")===-1?"[^.]":".",o=t.replace(vs,"\\$&").replace(js,r+n);return e+t.length===s.length?`(?:${o})?`:o}function $s(t,e,s){return t==="."&&(s[e-1]==="*"||s[e+1]==="*")?t:`\\${t}`}function As(t){let e=t.map(n=>n.replace(xs,$s).replace(Os,ws)),s=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${s}$`)}var Es=t=>{let e;return s=>(typeof e>"u"&&(e=t.every(n=>n.indexOf("*")===-1)?null:As(t)),e===null?t.indexOf(s)!==-1:e.test(s))};function jt(t=[],e={}){return new Ue(t,Object.assign({conditionsMatcher:gs,fieldMatcher:Es},e))}var Is=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`,vt=function(e){this.message=e};vt.prototype=Object.create(Error.prototype);var Le=class extends vt{static setDefaultMessage(e){this.P=typeof e=="string"?()=>e:e}static from(e){return new this(e)}constructor(e){super(""),this.ability=e,typeof Error.captureStackTrace=="function"&&(this.name="ForbiddenError",Error.captureStackTrace(this,this.constructor))}setMessage(e){return this.message=e,this}throwUnlessCan(e,s,n){let r=this.unlessCan(e,s,n);if(r)throw r}unlessCan(e,s,n){let r=this.ability.relevantRuleFor(e,s,n);if(r&&!r.inverted)return;this.action=e,this.subject=s,this.subjectType=ls(this.ability.detectSubjectType(s)),this.field=n;let o=r?r.reason:"";return this.message=this.message||o||this.constructor.P(this),this}};Le.P=Is;var an=Object.freeze({__proto__:null});function qe(t,e,s){if(t==null)return t;if(typeof t=="string"){if(t.indexOf("$principal.")!==0)return t;let r=t.slice(11).split(".").reduce((o,i)=>o==null?o:o[i],e);return r==null&&(s.unresolved=!0),r}if(Array.isArray(t))return t.map(n=>qe(n,e,s));if(typeof t=="object"){let n={};for(let r of Object.keys(t))n[r]=qe(t[r],e,s);return n}return t}function K(t,e){let s={unresolved:!1};return{conditions:qe(t,e,s),unresolved:s.unresolved}}function wt(t,e){return K(t,e).conditions}function P(t,e){let s=D(t,e),n=[];for(let r of e.rules){if(s.indexOf(r.subject)===-1)continue;let o={action:r.actions,subject:r.resource};if(r.where){let{conditions:i,unresolved:a}=K(r.where,t);if(a)continue;o.conditions=i}n.push(o)}return n}function N(t){return jt(Array.isArray(t)?t:[])}function $t(t,e){return N(P(t,e))}function w(t,e,s,n){return n==null?t.can(e,s):t.can(e,gt(s,Object.assign({},n)))}var $={ALL:"all",NONE:"none",FIELDS:"fields",AMBIGUOUS:"ambiguous"},At={$in:"in",$nin:"nin",$ne:"ne",$gt:"gt",$gte:"gte",$lt:"lt",$lte:"lte"};function Ns(t){let e=[];for(let s of Object.keys(t)){let n=t[s];if(n===null||typeof n!="object"||Array.isArray(n)){e.push({field:s,op:"eq",value:n});continue}let r=Object.keys(n);if(r.length!==1||!At[r[0]])return null;e.push({field:s,op:At[r[0]],value:n[r[0]]})}return e}var Fs=(t,e)=>t==="manage"||t===e||Array.isArray(t)&&(t.indexOf(e)!==-1||t.indexOf("manage")!==-1),Ms=(t,e)=>t==="all"||t===e;function Et(t,e,s,n){let r=P(t,e).filter(i=>Fs(i.action,s)&&Ms(i.subject,n));if(r.length===0)return{scope:$.NONE,clauses:[]};if(r.some(i=>!i.conditions))return{scope:$.ALL,clauses:[]};if(r.length>1)return{scope:$.AMBIGUOUS,clauses:[]};let o=Ns(r[0].conditions);return o?{scope:$.FIELDS,clauses:o}:{scope:$.AMBIGUOUS,clauses:[]}}function It(t,e){let s=t;for(let n of e)n.op==="in"?s=s.hasSome(n.field,n.value):n.op==="nin"?s=s.not(s.hasSome(n.field,n.value)):s=s[n.op](n.field,n.value);return s}var ze=/export\s+const\s+([A-Za-z0-9_$]+)\s*=\s*webMethod\s*\(\s*Permissions\s*\.\s*([A-Za-z0-9_$]+)/g,Ss=[[/export\s*{\s*[A-Za-z0-9_$,\s]+}/,"export { x } \u2014 the call and the export must be one statement"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*Permissions\s*\[/,"Permissions['X'] \u2014 the property must be dotted and literal"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*[A-Za-z0-9_$]+\s*\(/,"a computed permission \u2014 it must be written out as Permissions.LEVEL"]];function Be(t){let e={},s=String(t||"");ze.lastIndex=0;let n=ze.exec(s);for(;n;)e[n[1]]=n[2],n=ze.exec(s);return e}function Ve(t,e,s){let n=s||{},r=e&&e.api||{},o=Be(t),i=String(t||""),a=[],u=[];for(let p of Object.keys(o)){let c=r[p];c?c.permission!==o[p]&&a.push({name:p,declared:c.permission,written:o[p]}):u.push({name:p,gate:o[p]})}let l=n.complete?Object.keys(r).filter(p=>!(p in o)):[],h=[];for(let[p,c]of Ss)p.test(i)&&h.push(c);return{ok:a.length+u.length+l.length+h.length===0,found:o,mismatched:a,undeclared:u,missing:l,suspect:h}}function Nt(t,e,s){let n=Ve(t,e,s);if(n.ok)return!0;let r=[];for(let o of n.mismatched)r.push(o.name+": policy says "+o.declared+", the export says "+o.written);for(let o of n.undeclared)r.push(o.name+": gated "+o.gate+" but missing from policy.api");for(let o of n.missing)r.push(o+": declared in policy.api but not exported here");for(let o of n.suspect)r.push("unreachable export shape \u2014 "+o);throw new Error(`wix-access: web-method gates do not match the policy:
|
|
1
|
+
var X=Object.defineProperty;var Rt=Object.getOwnPropertyDescriptor;var Tt=Object.getOwnPropertyNames;var Pt=Object.prototype.hasOwnProperty;var kt=(t,e)=>{for(var n in e)X(t,n,{get:e[n],enumerable:!0})},Dt=(t,e,n,s)=>{if(e&&typeof e=="object"||typeof e=="function")for(let r of Tt(e))!Pt.call(t,r)&&r!==n&&X(t,r,{get:()=>e[r],enumerable:!(s=Rt(e,r))||s.enumerable});return t};var Lt=t=>Dt(X({},"__esModule",{value:!0}),t);var kn={};kt(kn,{CASES:()=>Ye,CODES:()=>E,KIND:()=>F,PACKAGE_VERSION:()=>Ge,PolicyError:()=>x,SCOPE:()=>$,WHEN:()=>y,abilityFor:()=>$t,abilityFromRules:()=>N,anonymous:()=>Ke,applyClauses:()=>It,applyGates:()=>Ft,assertGates:()=>Nt,can:()=>w,caseTable:()=>Mt,createAccess:()=>Ct,createPrincipal:()=>ne,deny:()=>ee,denyOpaque:()=>He,filterFor:()=>Et,frontendRoleTitles:()=>Pn,hasRole:()=>Qe,isDenial:()=>k,normaliseRoles:()=>te,ok:()=>Ze,parseGates:()=>Be,permissionFor:()=>et,publicPing:()=>Tn,resolvePlaceholders:()=>wt,resolveSubjects:()=>D,resolveWhere:()=>K,rulesFor:()=>T,validatePolicy:()=>Xe,verifyGates:()=>Ve});module.exports=Lt(kn);var _t=require("wix-members-frontend");var E={FORBIDDEN:"FORBIDDEN",UNAUTHENTICATED:"UNAUTHENTICATED",UNVERIFIED:"UNVERIFIED",NOT_FOUND:"NOT_FOUND",INVALID_POLICY:"INVALID_POLICY",INVALID_ARGUMENT:"INVALID_ARGUMENT"},x=class extends Error{constructor(e){super(e),this.name="PolicyError",this.code=E.INVALID_POLICY}};function Ze(t){return{ok:!0,data:t===void 0?null:t}}function ee(t,e,n){let s={ok:!1,code:t||E.FORBIDDEN};return e&&(s.action=e),n&&(s.detail=n),s}var k=t=>!!t&&t.ok===!1;function He(t){return ee(E.NOT_FOUND,t)}var F={VISITOR:"visitor",MEMBER:"member",CAPABILITY:"capability",SERVICE:"service"};function te(t){if(!Array.isArray(t))return[];let e=[];for(let n of t){if(typeof n=="string"){e.push(n);continue}if(!n||typeof n!="object")continue;let s=n.title||n.name||n.roleKey;s&&e.push(s)}return e}function ne(t){let e=t||{},n=e.memberId||null,s=te(e.roles);return{kind:e.kind||(n?F.MEMBER:F.VISITOR),memberId:n,roles:s,subjects:Array.isArray(e.subjects)?e.subjects.slice():[],domain:e.domain&&typeof e.domain=="object"?e.domain:{},unverified:!!e.unverified}}var Ke=()=>ne({kind:F.VISITOR}),Qe=(t,e)=>t.roles.indexOf(e)!==-1;var y={ANYONE:"anyone",ANONYMOUS:"anonymous",MEMBER:"member"},m=t=>!!t&&typeof t=="object"&&!Array.isArray(t),Ut=t=>Array.isArray(t)?t:[t];function f(t,e){throw new x("policy"+t+": "+e)}function qt(t,e){let n=".subjects."+t;m(e)||f(n,"must be an object");let r=["when","role","domain"].filter(o=>e[o]!==void 0);if(r.length===0&&f(n,'needs exactly one of when/role/domain \u2014 "{}" is ambiguous between a visitor and a member'),r.length>1&&f(n,"has "+r.join(" and ")+"; use exactly one"),e.when!==void 0){let o=[y.ANYONE,y.ANONYMOUS,y.MEMBER];o.indexOf(e.when)===-1&&f(n+".when","must be one of "+o.join(", ")+" (got "+JSON.stringify(e.when)+")")}e.role!==void 0&&typeof e.role!="string"&&f(n+".role","must be a string"),e.domain!==void 0&&typeof e.domain!="string"&&f(n+".domain","must be a string")}function zt(t,e,n){let s=".rules["+e+"]";m(t)||f(s,"must be an object"),typeof t.subject!="string"&&f(s+".subject","must be a string"),n.indexOf(t.subject)===-1&&f(s+".subject",'"'+t.subject+'" is not declared in policy.subjects'),t.actions===void 0&&f(s+".actions","is required");for(let r of Ut(t.actions))typeof r!="string"&&f(s+".actions","must be a string or an array of strings");typeof t.resource!="string"&&f(s+".resource","must be a string"),t.where!==void 0&&!m(t.where)&&f(s+".where","must be an object")}var We=["Anyone","SiteMember","Admin"];function Bt(t,e,n){let s=".api."+t;m(e)||f(s,"must be an object"),We.indexOf(e.permission)===-1&&f(s+".permission","must be one of "+We.join(", ")+" (got "+JSON.stringify(e.permission)+")"),e.ability!==void 0&&((!Array.isArray(e.ability)||e.ability.length!==2)&&f(s+".ability","must be [action, resource]"),(typeof e.ability[0]!="string"||typeof e.ability[1]!="string")&&f(s+".ability","both entries must be strings")),e.subject!==void 0&&n.indexOf(e.subject)===-1&&f(s+".subject",'"'+e.subject+'" is not declared in policy.subjects')}var Vt=["resource","owner","actor","tenant","profile"];function Gt(t,e){let n=".collections."+t;m(e)||f(n,"must be an object");for(let s of Vt)e[s]!==void 0&&(typeof e[s]!="string"||!e[s])&&f(n+"."+s,"must be a non-empty string");e.owner!==void 0&&e.owner===e.actor&&f(n,'owner and actor must be different fields (both are "'+e.owner+'")')}function Xe(t){if(!m(t))throw new x("policy must be an object");m(t.subjects)||f(".subjects","is required and must be an object");let e=Object.keys(t.subjects);e.length===0&&f(".subjects","declares no subjects");for(let n of e)qt(n,t.subjects[n]);if(Array.isArray(t.rules)||f(".rules","is required and must be an array"),t.rules.forEach((n,s)=>zt(n,s,e)),t.api!==void 0){m(t.api)||f(".api","must be an object");for(let n of Object.keys(t.api))Bt(n,t.api[n],e)}if(t.collections!==void 0){m(t.collections)||f(".collections","must be an object");for(let n of Object.keys(t.collections))Gt(n,t.collections[n])}return t}function D(t,e){let n=new Set(t.subjects||[]);for(let s of Object.keys(e.subjects)){let r=e.subjects[s];(r.when===y.ANYONE||r.when===y.ANONYMOUS&&!t.memberId||r.when===y.MEMBER&&t.memberId||r.role!==void 0&&t.roles.indexOf(r.role)!==-1||r.domain!==void 0&&t.domain[r.domain])&&n.add(s)}return Array.from(n)}function et(t,e){let n=t.api&&t.api[e];return n?n.permission:null}var L=class{constructor(e,n){this.operator=e,this.value=n,Object.defineProperty(this,"t",{writable:!0})}get notes(){return this.t}addNote(e){this.t=this.t||[],this.t.push(e)}},M=class extends L{},O=class extends M{constructor(e,n){if(!Array.isArray(n))throw new Error(`"${e}" operator expects to receive an array of conditions`);super(e,n)}},b="__itself__",j=class extends L{constructor(e,n,s){super(e,s),this.field=n}},ie=new M("__null__",null),oe=Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty);function Yt(t,e){return e instanceof O&&e.operator===t}function ae(t,e){return e.length===1?e[0]:new O(t,(function n(s,r,o){let i=o||[];for(let a=0,u=r.length;a<u;a++){let l=r[a];Yt(s,l)?n(s,l.value,i):i.push(l)}return i})(t,e))}var Jt=t=>t,tt=()=>Object.create(null),nt=Object.defineProperty(tt(),"__@type@__",{value:"ignore value"});function Zt(t,e,n=!1){if(!t||t&&t.constructor!==Object)return!1;for(let s in t)if(oe(t,s)&&oe(e,s)&&(!n||t[s]!==nt))return!0;return!1}function Ht(t){let e=[];for(let n in t)oe(t,n)&&t[n]!==nt&&e.push(n);return e}function se(t,e){e!==ie&&t.push(e)}var ce=t=>ae("and",t);var U={compound(t,e,n){let s=(Array.isArray(e)?e:[e]).map(r=>n.parse(r));return new O(t.name,s)},field:(t,e,n)=>new j(t.name,n.field,e),document:(t,e)=>new M(t.name,e)},S=class{constructor(e,n=tt()){this.o=void 0,this.s=void 0,this.i=void 0,this.u=void 0,this.h=void 0,this.parse=this.parse.bind(this),this.u={operatorToConditionName:n.operatorToConditionName||Jt,defaultOperatorName:n.defaultOperatorName||"eq",mergeFinalConditions:n.mergeFinalConditions||ce},this.o=Object.keys(e).reduce((s,r)=>(s[r]=Object.assign({name:this.u.operatorToConditionName(r)},e[r]),s),{}),this.s=Object.assign({},n.fieldContext,{field:"",query:{},parse:this.parse,hasOperators:s=>Zt(s,this.o,n.useIgnoreValue)}),this.i=Object.assign({},n.documentContext,{parse:this.parse,query:{}}),this.h=n.useIgnoreValue?Ht:Object.keys}setParse(e){this.parse=e,this.s.parse=e,this.i.parse=e}parseField(e,n,s,r){let o=this.o[n];if(!o)throw new Error(`Unsupported operator "${n}"`);if(o.type!=="field")throw new Error(`Unexpected ${o.type} operator "${n}" at field level`);return this.s.field=e,this.s.query=r,this.parseInstruction(o,s,this.s)}parseInstruction(e,n,s){return typeof e.validate=="function"&&e.validate(e,n),(e.parse||U[e.type])(e,n,s)}parseFieldOperators(e,n){let s=[],r=this.h(n);for(let o=0,i=r.length;o<i;o++){let a=r[o];if(!this.o[a])throw new Error(`Field query for "${e}" may contain only operators or a plain object as a value`);se(s,this.parseField(e,a,n[a],n))}return s}parse(e){let n=[],s=this.h(e);this.i.query=e;for(let r=0,o=s.length;r<o;r++){let i=s[r],a=e[i],u=this.o[i];if(u){if(u.type!=="document"&&u.type!=="compound")throw new Error(`Cannot use parsing instruction for operator "${i}" in "document" context as it is supposed to be used in "${u.type}" context`);se(n,this.parseInstruction(u,a,this.i))}else this.s.hasOperators(a)?n.push(...this.parseFieldOperators(i,a)):se(n,this.parseField(i,this.u.defaultOperatorName,a,e))}return this.u.mergeFinalConditions(n)}};function re(t,e){let n=t[e];if(typeof n!="function")throw new Error(`Unable to interpret "${e}" condition. Did you forget to register interpreter for it?`);return n}function Kt(t){return t.operator}function st(t,e){let n=e,s=n&&n.getInterpreterName||Kt,r;switch(n?n.numberOfArguments:0){case 1:r=i=>{let a=s(i,n);return re(t,a)(i,o)};break;case 3:r=(i,a,u)=>{let l=s(i,n);return re(t,l)(i,a,u,o)};break;default:r=(i,a)=>{let u=s(i,n);return re(t,u)(i,a,o)}}let o=Object.assign({},n,{interpret:r});return o.interpret}function rt(t,e){return(n,...s)=>{let r=t(n,...s),o=e.bind(null,r);return o.ast=r,o}}var Gn=S.prototype.parseInstruction;function ot(t,e){if(!Array.isArray(e))throw new Error(`"${t.name}" expects value to be an array`)}function it(t,e){if(ot(t,e),!e.length)throw new Error(`"${t.name}" expects to have at least one element in array`)}var ue=t=>(e,n)=>{if(typeof n!==t)throw new Error(`"${e.name}" expects value to be a "${t}"`)},at={type:"compound",validate:it,parse(t,e,{parse:n}){let s=e.map(r=>n(r));return ae(t.name,s)}},Qt=at,Wt={type:"compound",validate:it},Xt={type:"field",validate(t,e){if(!(e&&(e instanceof RegExp||e.constructor===Object)))throw new Error(`"${t.name}" expects to receive either regular expression or object of field operators`)},parse(t,e,n){let s=e instanceof RegExp?new j("regex",n.field,e):n.parse(e,n);return new O(t.name,[s])}},le={type:"field",validate(t,e){if(!e||e.constructor!==Object)throw new Error(`"${t.name}" expects to receive an object with nested query or field level operators`)},parse(t,e,{parse:n,field:s,hasOperators:r}){let o=r(e)?n(e,{field:b}):n(e);return new j(t.name,s,o)}},fe={type:"field",validate:ue("number")},C={type:"field",validate:ot},pe=C,de=C,en={type:"field",validate(t,e){if(!Array.isArray(e)||e.length!==2)throw new Error(`"${t.name}" expects an array with 2 numeric elements`)}},he={type:"field",validate:ue("boolean")},z={type:"field",validate:function(t,e){if(!(typeof e=="string"||typeof e=="number"||e instanceof Date))throw new Error(`"${t.name}" expects value to be comparable (i.e., string, number or date)`)}},_=z,me=_,ye=_,B={type:"field"},be=B,ge={type:"field",validate(t,e){if(!(e instanceof RegExp)&&typeof e!="string")throw new Error(`"${t.name}" expects value to be a regular expression or a string that represents regular expression`)},parse(t,e,n){let s=typeof e=="string"?new RegExp(e,n.query.$options||""):e;return new j(t.name,n.field,s)}},xe={type:"field",parse:()=>ie},tn={type:"document",validate:ue("function")},nn=Object.freeze({__proto__:null,$and:at,$or:Qt,$nor:Wt,$not:Xt,$elemMatch:le,$size:fe,$in:C,$nin:pe,$all:de,$mod:en,$exists:he,$gte:z,$gt:_,$lt:me,$lte:ye,$eq:B,$ne:be,$regex:ge,$options:xe,$where:tn}),q=class extends S{constructor(e){super(e,{defaultOperatorName:"$eq",operatorToConditionName:n=>n.slice(1)})}parse(e,n){return n&&n.field?ce(this.parseFieldOperators(n.field,e)):super.parse(e)}},V=nn;function Oe(t,e,n){for(let s=0,r=t.length;s<r;s++)if(n(t[s],e)===0)return!0;return!1}function je(t,e){return Array.isArray(t)&&Number.isNaN(Number(e))}function ct(t,e,n){if(!je(t,e))return n(t,e);let s=[];for(let r=0;r<t.length;r++){let o=n(t[r],e);o!==void 0&&(s=s.concat(o))}return s}function v(t){return(e,n,s)=>{let r=s.get(n,e.field);return Array.isArray(r)?r.some(o=>t(e,o,s)):t(e,r,s)}}var sn=Object.hasOwn||Object.prototype.hasOwnProperty.call.bind(Object.prototype.hasOwnProperty),rn=(t,e)=>t[e];function ut(t,e,n){let s=e.lastIndexOf(".");return s===-1?[t,e]:[n(t,e.slice(0,s)),e.slice(s+1)]}function on(t,e,n=rn){if(e===b)return t;if(!t)throw new Error(`Unable to get field "${e}" out of ${String(t)}.`);return(function(s,r,o){if(r.indexOf(".")===-1)return ct(s,r,o);let i=r.split("."),a=s;for(let u=0,l=i.length;u<l;u++)if(a=ct(a,i[u],o),!a||typeof a!="object")return u<l-1?void 0:a;return a})(t,e,n)}function ve(t,e){return t===e?0:t>e?1:-1}function we(t,e={}){return st(t,Object.assign({get:on,compare:ve},e))}var lt=(t,e,{interpret:n})=>t.value.some(s=>n(s,e)),an=(t,e,n)=>!lt(t,e,n),$e=(t,e,{interpret:n})=>t.value.every(s=>n(s,e)),cn=(t,e,{interpret:n})=>!n(t.value[0],e),G=(t,e,{compare:n,get:s})=>{let r=s(e,t.field);return Array.isArray(r)&&!Array.isArray(t.value)?Oe(r,t.value,n):n(r,t.value)===0},Ae=(t,e,n)=>!G(t,e,n),Ee=v((t,e,n)=>{let s=n.compare(e,t.value);return s===0||s===-1}),Ie=v((t,e,n)=>n.compare(e,t.value)===-1),Ne=v((t,e,n)=>n.compare(e,t.value)===1),Fe=v((t,e,n)=>{let s=n.compare(e,t.value);return s===0||s===1}),Me=(t,e,{get:n})=>{if(t.field===b)return e!==void 0;let[s,r]=ut(e,t.field,n),o=i=>i==null?!!i===t.value:sn(i,r)===t.value;return je(s,r)?s.some(o):o(s)},un=v((t,e)=>typeof e=="number"&&e%t.value[0]===t.value[1]),Se=(t,e,{get:n})=>{let[s,r]=ut(e,t.field,n),o=i=>{let a=n(i,r);return Array.isArray(a)&&a.length===t.value};return t.field!==b&&je(s,r)?s.some(o):o(s)},Ce=v((t,e)=>typeof e=="string"&&t.value.test(e)),R=v((t,e,{compare:n})=>Oe(t.value,e,n)),_e=(t,e,n)=>!R(t,e,n),Re=(t,e,{compare:n,get:s})=>{let r=s(e,t.field);return Array.isArray(r)&&t.value.every(o=>Oe(r,o,n))},Te=(t,e,{interpret:n,get:s})=>{let r=s(e,t.field);return Array.isArray(r)&&r.some(o=>n(t.value,o))},ln=(t,e)=>t.value.call(e),fn=Object.freeze({__proto__:null,or:lt,nor:an,and:$e,not:cn,eq:G,ne:Ae,lte:Ee,lt:Ie,gt:Ne,gte:Fe,exists:Me,mod:un,size:Se,regex:Ce,within:R,nin:_e,all:Re,elemMatch:Te,where:ln}),Y=Object.assign({},fn,{in:R}),Qn=we(Y);function ft(t){return t===null||typeof t!="object"?t:t instanceof Date?t.getTime():t&&typeof t.toJSON=="function"?t.toJSON():t}var pn=(t,e)=>ve(ft(t),ft(e));function J(t,e,n){let s=new q(t),r=we(e,Object.assign({compare:pn},n));if(n&&n.forPrimitives){let o={field:b},i=s.parse;s.setParse(a=>i(a,o))}return rt(s.parse,r)}var ns=J(V,Y),ss=J(["$and","$or"].reduce((t,e)=>(t[e]=Object.assign({},t[e],{type:"field"}),t),Object.assign({},V,{$nor:Object.assign({},V.$nor,{type:"field",parse:U.compound})})),Y,{forPrimitives:!0});var bt=Object.hasOwn||((t,e)=>Object.prototype.hasOwnProperty.call(t,e));function Pe(t){return Array.isArray(t)?t:[t]}var I="__caslSubjectType__";function gt(t,e){if(e){if(!bt(e,I))Object.defineProperty(e,I,{value:t});else if(t!==e[I])throw new Error(`Trying to cast object to subject type ${t} but previously it was casted to ${e[I]}`)}return e}var H=t=>{let e=typeof t;return e==="string"||e==="function"},xt=t=>t.modelName||t.name;function dn(t){return typeof t=="string"?t:xt(t)}function Ot(t){return bt(t,I)?t[I]:xt(t.constructor)}var pt={function:t=>t.constructor,string:Ot};function dt(t,e,n){for(let s=n;s<e.length;s++)t.push(e[s])}function ht(t,e){if(!t||!t.length)return e||[];if(!e||!e.length)return t||[];let n=0,s=0,r=[];for(;n<t.length&&s<e.length;)t[n].priority<e[s].priority?(r.push(t[n]),n++):t[n].priority>e[s].priority?(r.push(e[s]),s++):(r.push(t[n]),n++,s++);return dt(r,t,n),dt(r,e,s),r}function Z(t,e,n){let s=t.get(e);return s||(s=n(),t.set(e,s)),s}var hn=t=>t;function mn(t,e){let n;for(let s=0;s<t.length;s++){let r=e(t[s]);n&&r&&n.push(t[s]),r||(n??(n=t.slice(0,s)))}return n||t}function yn(t,e){if(Array.isArray(t.fields)&&!t.fields.length)throw new Error("`rawRule.fields` cannot be an empty array. https://bit.ly/390miLa");if(t.fields&&!e.fieldMatcher)throw new Error('You need to pass "fieldMatcher" option in order to restrict access by fields');if(t.conditions&&!e.conditionsMatcher)throw new Error('You need to pass "conditionsMatcher" option in order to restrict access by conditions')}var ke=class{constructor(e,n,s=0){yn(e,n),this.action=n.resolveAction(e.action),this.subject=e.subject,this.inverted=!!e.inverted,this.conditions=e.conditions,this.reason=e.reason,this.origin=e,this.fields=e.fields?Pe(e.fields):void 0,this.priority=s,this.t=n}i(){return this.conditions&&!this.o&&(this.o=this.t.conditionsMatcher(this.conditions)),this.o}get ast(){let e=this.i();return e?e.ast:void 0}matchesConditions(e){return this.conditions?!e||H(e)?!this.inverted:this.i()(e):!0}matchesField(e){return this.fields?e?(this.u||(this.u=this.t.fieldMatcher(this.fields)),this.u(e)):!this.inverted:!0}};function bn(t,e){let n={value:t,prev:e,next:null};return e&&(e.next=n),n}function gn(t){t.next&&(t.next.prev=t.prev),t.prev&&(t.prev.next=t.next),t.next=t.prev=null}var mt=()=>({rules:[],merged:!1}),yt=()=>new Map,De=class{constructor(e=[],n={}){this.h=!1,this.l=new Map,this.p={conditionsMatcher:n.conditionsMatcher,fieldMatcher:n.fieldMatcher,resolveAction:n.resolveAction||hn},this.$=n.anyAction||"manage",this.A=n.anySubjectType||"all",this.m=e,this.M=!!n.detectSubjectType,this.j=n.detectSubjectType||Ot,this.v(e)}get rules(){return this.m}detectSubjectType(e){return H(e)?e:e?this.j(e):this.A}update(e){let n={rules:e,ability:this,target:this};return this._("update",n),this.m=e,this.v(e),this._("updated",n),this}v(e){let n=new Map,s;for(let r=e.length-1;r>=0;r--){let o=e.length-r-1,i=new ke(e[r],this.p,o),a=Pe(i.action),u=Pe(i.subject||this.A);!this.h&&i.fields&&(this.h=!0);for(let l=0;l<u.length;l++){let h=Z(n,u[l],yt);s===void 0&&(s=typeof u[l]),typeof u[l]!==s&&s!=="mixed"&&(s="mixed");for(let A=0;A<a.length;A++)Z(h,a[A],mt).rules.push(i)}}if(this.l=n,s!=="mixed"&&!this.M){let r=pt[s]||pt.string;this.j=r}}possibleRulesFor(e,n=this.A){if(!H(n))throw new Error('"possibleRulesFor" accepts only subject types (i.e., string or class) as the 2nd parameter');let s=Z(this.l,n,yt),r=Z(s,e,mt);if(r.merged)return r.rules;let o=e!==this.$&&s.has(this.$)?s.get(this.$).rules:void 0,i=ht(r.rules,o);return n!==this.A&&(i=ht(i,this.possibleRulesFor(e,this.A))),r.rules=i,r.merged=!0,i}rulesFor(e,n,s){let r=this.possibleRulesFor(e,n);if(s&&typeof s!="string")throw new Error("The 3rd, `field` parameter is expected to be a string. See https://stalniy.github.io/casl/en/api/casl-ability#can-of-pure-ability for details");return this.h?mn(r,o=>o.matchesField(s)):r}actionsFor(e){if(!H(e))throw new Error('"actionsFor" accepts only subject types (i.e., string or class) as a parameter');let n=new Set,s=this.l.get(e);s&&Array.from(s.keys()).forEach(o=>n.add(o));let r=e!==this.A?this.l.get(this.A):void 0;return r&&Array.from(r.keys()).forEach(o=>n.add(o)),Array.from(n)}on(e,n){this.F=this.F||new Map;let s=this.F,r=s.get(e)||null,o=bn(n,r);return s.set(e,o),()=>{let i=s.get(e);!o.next&&!o.prev&&i===o?s.delete(e):o===i&&s.set(e,o.prev),gn(o)}}_(e,n){if(!this.F)return;let s=this.F.get(e)||null,r=[];for(;s!==null;)r.push(s.value),s=s.prev;for(let o=0;o<r.length;o++)r[o](n)}},Le=class extends De{can(e,n,s){let r=this.relevantRuleFor(e,n,s);return!!r&&!r.inverted}relevantRuleFor(e,n,s){let r=this.detectSubjectType(n),o=this.rulesFor(e,r,s);for(let i=0,a=o.length;i<a;i++)if(o[i].matchesConditions(n))return o[i];return null}cannot(e,n,s){return!this.can(e,n,s)}},xn={$eq:B,$ne:be,$lt:me,$lte:ye,$gt:_,$gte:z,$in:C,$nin:pe,$all:de,$size:fe,$regex:ge,$options:xe,$elemMatch:le,$exists:he},On={eq:G,ne:Ae,lt:Ie,lte:Ee,gt:Ne,gte:Fe,in:R,nin:_e,all:Re,size:Se,regex:Ce,elemMatch:Te,exists:Me,and:$e};var jn=J(xn,On),vn=/[-/\\^$+?.()|[\]{}]/g,wn=/\.?\*+\.?/g,$n=/\*+/,An=/\./g;function En(t,e,n){let s=n[0]==="*"||t[0]==="."&&t[t.length-1]==="."?"+":"*",r=t.indexOf("**")===-1?"[^.]":".",o=t.replace(An,"\\$&").replace($n,r+s);return e+t.length===n.length?`(?:${o})?`:o}function In(t,e,n){return t==="."&&(n[e-1]==="*"||n[e+1]==="*")?t:`\\${t}`}function Nn(t){let e=t.map(s=>s.replace(vn,In).replace(wn,En)),n=e.length>1?`(?:${e.join("|")})`:e[0];return new RegExp(`^${n}$`)}var Fn=t=>{let e;return n=>(typeof e>"u"&&(e=t.every(s=>s.indexOf("*")===-1)?null:Nn(t)),e===null?t.indexOf(n)!==-1:e.test(n))};function jt(t=[],e={}){return new Le(t,Object.assign({conditionsMatcher:jn,fieldMatcher:Fn},e))}var Mn=t=>`Cannot execute "${t.action}" on "${t.subjectType}"`,vt=function(e){this.message=e};vt.prototype=Object.create(Error.prototype);var Ue=class extends vt{static setDefaultMessage(e){this.P=typeof e=="string"?()=>e:e}static from(e){return new this(e)}constructor(e){super(""),this.ability=e,typeof Error.captureStackTrace=="function"&&(this.name="ForbiddenError",Error.captureStackTrace(this,this.constructor))}setMessage(e){return this.message=e,this}throwUnlessCan(e,n,s){let r=this.unlessCan(e,n,s);if(r)throw r}unlessCan(e,n,s){let r=this.ability.relevantRuleFor(e,n,s);if(r&&!r.inverted)return;this.action=e,this.subject=n,this.subjectType=dn(this.ability.detectSubjectType(n)),this.field=s;let o=r?r.reason:"";return this.message=this.message||o||this.constructor.P(this),this}};Ue.P=Mn;var us=Object.freeze({__proto__:null});function qe(t,e,n){if(t==null)return t;if(typeof t=="string"){if(t.indexOf("$principal.")!==0)return t;let r=t.slice(11).split(".").reduce((o,i)=>o==null?o:o[i],e);return r==null&&(n.unresolved=!0),r}if(Array.isArray(t))return t.map(s=>qe(s,e,n));if(typeof t=="object"){let s={};for(let r of Object.keys(t))s[r]=qe(t[r],e,n);return s}return t}function K(t,e){let n={unresolved:!1};return{conditions:qe(t,e,n),unresolved:n.unresolved}}function wt(t,e){return K(t,e).conditions}function T(t,e){let n=D(t,e),s=[];for(let r of e.rules){if(n.indexOf(r.subject)===-1)continue;let o={action:r.actions,subject:r.resource};if(r.where){let{conditions:i,unresolved:a}=K(r.where,t);if(a)continue;o.conditions=i}s.push(o)}return s}function N(t){return jt(Array.isArray(t)?t:[])}function $t(t,e){return N(T(t,e))}function w(t,e,n,s){return s==null?t.can(e,n):t.can(e,gt(n,Object.assign({},s)))}var $={ALL:"all",NONE:"none",FIELDS:"fields",AMBIGUOUS:"ambiguous"},At={$in:"in",$nin:"nin",$ne:"ne",$gt:"gt",$gte:"gte",$lt:"lt",$lte:"lte"};function Sn(t){let e=[];for(let n of Object.keys(t)){let s=t[n];if(s===null||typeof s!="object"||Array.isArray(s)){e.push({field:n,op:"eq",value:s});continue}let r=Object.keys(s);if(r.length!==1||!At[r[0]])return null;e.push({field:n,op:At[r[0]],value:s[r[0]]})}return e}var Cn=(t,e)=>t==="manage"||t===e||Array.isArray(t)&&(t.indexOf(e)!==-1||t.indexOf("manage")!==-1),_n=(t,e)=>t==="all"||t===e;function Et(t,e,n,s){let r=T(t,e).filter(i=>Cn(i.action,n)&&_n(i.subject,s));if(r.length===0)return{scope:$.NONE,clauses:[]};if(r.some(i=>!i.conditions))return{scope:$.ALL,clauses:[]};if(r.length>1)return{scope:$.AMBIGUOUS,clauses:[]};let o=Sn(r[0].conditions);return o?{scope:$.FIELDS,clauses:o}:{scope:$.AMBIGUOUS,clauses:[]}}function It(t,e){let n=t;for(let s of e)s.op==="in"?n=n.hasSome(s.field,s.value):s.op==="nin"?n=n.not(n.hasSome(s.field,s.value)):n=n[s.op](s.field,s.value);return n}var ze=/export\s+const\s+([A-Za-z0-9_$]+)\s*=\s*webMethod\s*\(\s*Permissions\s*\.\s*([A-Za-z0-9_$]+)/g,Rn=[[/export\s*{\s*[A-Za-z0-9_$,\s]+}/,"export { x } \u2014 the call and the export must be one statement"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*Permissions\s*\[/,"Permissions['X'] \u2014 the property must be dotted and literal"],[/export\s+const\s+[A-Za-z0-9_$]+\s*=\s*webMethod\s*\(\s*[A-Za-z0-9_$]+\s*\(/,"a computed permission \u2014 it must be written out as Permissions.LEVEL"]];function Be(t){let e={},n=String(t||"");ze.lastIndex=0;let s=ze.exec(n);for(;s;)e[s[1]]=s[2],s=ze.exec(n);return e}function Ve(t,e,n){let s=n||{},r=e&&e.api||{},o=Be(t),i=String(t||""),a=[],u=[];for(let p of Object.keys(o)){let c=r[p];c?c.permission!==o[p]&&a.push({name:p,declared:c.permission,written:o[p]}):u.push({name:p,gate:o[p]})}let l=s.complete?Object.keys(r).filter(p=>!(p in o)):[],h=[];for(let[p,c]of Rn)p.test(i)&&h.push(c);return{ok:a.length+u.length+l.length+h.length===0,found:o,mismatched:a,undeclared:u,missing:l,suspect:h}}function Nt(t,e,n){let s=Ve(t,e,n);if(s.ok)return!0;let r=[];for(let o of s.mismatched)r.push(o.name+": policy says "+o.declared+", the export says "+o.written);for(let o of s.undeclared)r.push(o.name+": gated "+o.gate+" but missing from policy.api");for(let o of s.missing)r.push(o+": declared in policy.api but not exported here");for(let o of s.suspect)r.push("unreachable export shape \u2014 "+o);throw new Error(`wix-access: web-method gates do not match the policy:
|
|
2
2
|
`+r.join(`
|
|
3
|
-
`))}function Ft(t,e){let
|
|
3
|
+
`))}function Ft(t,e){let n=e&&e.api||{},s=t||{},r={},o=[];for(let i of Object.keys(s)){let a=s[i],u=n[i];if(!u){o.push(i);continue}if(typeof a!="function"){o.push(i+" (not a function: "+typeof a+")");continue}try{a.permission=u.permission,r[i]=u.permission}catch(l){o.push(i+" (could not stamp: "+String(l&&l.message)+")")}}if(o.length)throw new Error("wix-access: applyGates could not gate: "+o.join(", ")+". Every exported web method must be declared in policy.api.");return r}var Ge="0.5.1";var Ye=[{action:"read",type:"Booking",object:{customerId:"m-1"}},{action:"read",type:"Booking",object:{customerId:"m-2"}},{action:"cancel",type:"Booking",object:{customerId:"m-1"}},{action:"delete",type:"Booking",object:{customerId:"m-1"}},{action:"manage",type:"Vendor",object:{_id:"v-1"}}];function Mt(t){return Ye.map(e=>({action:e.action,type:e.type,object:e.object,can:w(t,e.action,e.type,e.object)}))}var Q=N([]),St="wix-access: createAccess({ fetchRules }) needs your web method, e.g. import { getMyAbilities } from 'backend/access.web'. The package cannot import it for you \u2014 that specifier only resolves inside your project. If it is imported and still not a function, build the kit inside onReady and pass an arrow: fetchRules: (...a) => getMyAbilities(...a).";function Ct(t){let e=t||{},n=e.fetchRules,s=e.onError||null,r=typeof n!="function",o=Q,i=[],a=!1,u=!1,l=null,h=null;async function A(){if(r)return i=[],o=Q,u=!0,l=St,a=!0,s&&s(new Error(St)),p;try{let c=await n();if(k(c))return i=[],o=Q,u=!0,l="rules refused: "+(c.code||"FORBIDDEN"),a=!0,s&&s(new Error(l)),p;i=Array.isArray(c)?c:[],o=N(i),u=!1}catch(c){i=[],o=Q,u=!0,l=String(c&&c.message||c),s&&s(c)}return a=!0,p}let p={ready(){return a?Promise.resolve(p):(h||(h=A().then(c=>(h=null,c))),h)},refresh(){return a=!1,u=!1,l=null,h=null,p.ready()},can:(c,d,g)=>w(o,c,d,g),cannot:(c,d,g)=>!w(o,c,d,g),rules:()=>i.slice(),get loaded(){return a},get failed(){return u},get reason(){return l},guard(c,d,g,P,W){let Je=p.can(d,g,P);return p.apply(c,Je,W),Je},apply(c,d,g){if(!c)return d;let P=g||"hide";try{P==="disable"?d&&c.enable?c.enable():!d&&c.disable&&c.disable():P==="collapse"?d&&c.expand?c.expand():!d&&c.collapse&&c.collapse():d&&c.show?c.show():!d&&c.hide&&c.hide()}catch(W){s&&s(W)}return d}};return p}function Tn(){return{ok:!0,side:"public",version:Ge}}async function Pn(){try{return(await _t.currentMember.getRoles()).map(e=>e.title)}catch{return[]}}0&&(module.exports={CASES,CODES,KIND,PACKAGE_VERSION,PolicyError,SCOPE,WHEN,abilityFor,abilityFromRules,anonymous,applyClauses,applyGates,assertGates,can,caseTable,createAccess,createPrincipal,deny,denyOpaque,filterFor,frontendRoleTitles,hasRole,isDenial,normaliseRoles,ok,parseGates,permissionFor,publicPing,resolvePlaceholders,resolveSubjects,resolveWhere,rulesFor,validatePolicy,verifyGates});
|
package/types.d.ts
CHANGED
|
@@ -22,8 +22,13 @@ export interface Rule {
|
|
|
22
22
|
export interface CollectionSpec {
|
|
23
23
|
/** Resource name used in rules. Defaults to the collection id. */
|
|
24
24
|
resource?: string
|
|
25
|
-
/**
|
|
25
|
+
/**
|
|
26
|
+
* Field holding whose row this is — `_owner` is unusable. The gateway sets it to the
|
|
27
|
+
* caller's member id, or to `onBehalfOf`; never from the record. Moves only by `transfer`.
|
|
28
|
+
*/
|
|
26
29
|
owner?: string
|
|
30
|
+
/** Field stamped with the member id of whoever really created the row. Never changes. */
|
|
31
|
+
actor?: string
|
|
27
32
|
tenant?: string
|
|
28
33
|
profile?: string
|
|
29
34
|
}
|